我正在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
型
4条答案
按热度按时间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使用双引号作为转义字符:
字符串
这可能解释了逗号字符在被引用的列中没有被正确解释。
Spark csv格式的选项在Apache Spark网站上没有很好的文档,但这里有一个有点旧的文档,我仍然觉得很有用:
https://github.com/databricks/spark-csv的
2018年8月更新:Spark 3.0可能会将此行为更改为符合RFC。有关详细信息,请参阅SPARK-22236。
pbwdgjma2#
对于任何在Scala中这样做的人:Tagar的回答几乎对我有用(谢谢!);我所要做的就是在设置选项参数时避免双引号:
字符串
我使用的是Spark 2.3,所以我可以确认Tagar的解决方案在新版本下仍然可以正常工作。
qmelpv7a3#
对于那些仍然想知道他们的解析器在使用Tagar的解决方案后是否仍然不工作的人。
Pyspark 3.1.2
.option("quote", "\"")
是默认的,所以这是没有必要的,但是在我的情况下,我有多行数据,所以spark无法在单个数据点和每行的末尾自动检测\n
,所以使用.option("multiline", True)
解决了我的问题,沿着使用.option('escape', "\"")
,所以通常最好默认使用多行选项mutmk8jj4#
默认情况下,
quotes
中指定的分隔符(comma
)将被忽略。Spark SQL在Spark 2.0中有内置的CSV读取器。字符串
更多关于CSV阅读器的信息,请点击这里。