阅读csv文件,其中引用的字段包含嵌入逗号

lb3vh1jj  于 5个月前  发布在  其他
关注(0)|答案(4)|浏览(46)

我正在Pyspark中阅读一个csv文件,如下所示:

df_raw=spark.read.option("header","true").csv(csv_path)

字符串
但是,数据文件中引用的字段中嵌入了逗号,不应该被视为逗号。我如何在Pyspark中处理这个问题?我知道pandas可以处理这个问题,但是Spark可以吗?我使用的版本是Spark 2.0.0。
下面是一个在Pandas中工作但在Spark中失败的例子:

In [1]: import pandas as pd

In [2]: pdf = pd.read_csv('malformed_data.csv')

In [3]: sdf=spark.read.format("org.apache.spark.csv").csv('malformed_data.csv',header=True)

In [4]: pdf[['col12','col13','col14']]
Out[4]:
                    col12                                             col13  \
0  32 XIY "W"   JK, RE LK  SOMETHINGLIKEAPHENOMENON#YOUGOTSOUL~BRINGDANOISE
1                     NaN                     OUTKAST#THROOTS~WUTANG#RUNDMC

   col14
0   23.0
1    0.0

In [5]: sdf.select("col12","col13",'col14').show()
+------------------+--------------------+--------------------+
|             col12|               col13|               col14|
+------------------+--------------------+--------------------+
|"32 XIY ""W""   JK|              RE LK"|SOMETHINGLIKEAPHE...|
|              null|OUTKAST#THROOTS~W...|                 0.0|
+------------------+--------------------+--------------------+


文件的内容:

col1,col2,col3,col4,col5,col6,col7,col8,col9,col10,col11,col12,col13,col14,col15,col16,col17,col18,col19
80015360210876000,11.22,X,4076710258,,,sxsw,,"32 YIU ""A""",S5,,"32 XIY ""W""   JK, RE LK",SOMETHINGLIKEAPHENOMENON#YOUGOTSOUL~BRINGDANOISE,23.0,cyclingstats,2012-25-19,432,2023-05-17,CODERED
61670000229561918,137.12,U,8234971771,,,woodstock,,,T4,,,OUTKAST#THROOTS~WUTANG#RUNDMC,0.0,runstats,2013-21-22,1333,2019-11-23,CODEBLUE

tktrz96b

tktrz96b1#

我注意到你的问题行有转义,它使用了双引号:
“32 XIY““W””JK,RE LK”
它应该是解释器,
32 XIY“W”JK,RE LK
RFC-4180第2页所述-
1.如果使用双引号括住字段,则必须通过在字段中使用另一个双引号对其进行转义
这就是Excel默认情况下所做的事情。
虽然在Spark中(从Spark 2.1开始),转义默认是通过非RFC的方式完成的,使用backslah(\)。要解决这个问题,你必须显式地告诉Spark使用双引号作为转义字符:

.option("quote", "\"")
.option("escape", "\"")

字符串
这可能解释了逗号字符在被引用的列中没有被正确解释。
Spark csv格式的选项在Apache Spark网站上没有很好的文档,但这里有一个有点旧的文档,我仍然觉得很有用:
https://github.com/databricks/spark-csv

2018年8月更新:Spark 3.0可能会将此行为更改为符合RFC。有关详细信息,请参阅SPARK-22236

pbwdgjma

pbwdgjma2#

对于任何在Scala中这样做的人:Tagar的回答几乎对我有用(谢谢!);我所要做的就是在设置选项参数时避免双引号:

.option("quote", "\"")
.option("escape", "\"")

字符串
我使用的是Spark 2.3,所以我可以确认Tagar的解决方案在新版本下仍然可以正常工作。

qmelpv7a

qmelpv7a3#

对于那些仍然想知道他们的解析器在使用Tagar的解决方案后是否仍然不工作的人。
Pyspark 3.1.2 .option("quote", "\"")是默认的,所以这是没有必要的,但是在我的情况下,我有多行数据,所以spark无法在单个数据点和每行的末尾自动检测\n,所以使用.option("multiline", True)解决了我的问题,沿着使用.option('escape', "\""),所以通常最好默认使用多行选项

mutmk8jj

mutmk8jj4#

默认情况下,quotes中指定的分隔符(comma)将被忽略。Spark SQL在Spark 2.0中有内置的CSV读取器。

df = session.read
  .option("header", "true")
  .csv("csv/file/path")

字符串
更多关于CSV阅读器的信息,请点击这里。

相关问题