在Spark CSV读取中如何转义换行符

7
我正在使用Spark 2.2.1版本,并使用以下Python代码,我可以转义特殊字符如@:
我想转义特殊字符,如换行符(\n)和回车符(\r)。我替换了@为\n,但它没有起作用。请有什么建议。
spark_df = spark.read.csv(file.csv,mode="DROPMALFORMED",inferSchema=True,header =True,escape="@")

不起作用:

spark_df = spark.read.csv(file.csv,mode="DROPMALFORMED",inferSchema=True,header =True,escape="\n")
2个回答

24

如果您的目标是读取包含多个换行符文本内容的csv文件,则使用spark的multiline option是正确的方法。

我最近在那里发布了一些scala代码

val df = spark.read
.option("wholeFile", true)
.option("multiline",true)
.option("header", true)
.option("inferSchema", "true")
.option("dateFormat", "yyyy-MM-dd")
.option("timestampFormat", "yyyy-MM-dd HH:mm:ss")
.csv("test.csv")

Python语法会略有不同,但应该能够很好地工作。


请问您能否给我提供一个正确的链接,让我能够查看Scala代码? - data_addict
我在答案中添加了它。 - parisni
1
谢谢。然而上面的答案使用了Pandas,而不是Spark。这对于大型CSV文件来说无法扩展。 - parisni
2
我有Spark2.2,但选项multiLine仍然无法工作。 - Usman Azhar
2
即使将 multiLine 设为 True,仍然会存在 \r\n 组合的问题,其中 \r 可能会被保留。如上所述,使用 read 语句时,我曾看到最右侧的列标题以 \r 结尾,该行中的某些行也以 \r 结尾。 - demongolem
显示剩余3条评论

-2
你可以使用pandas来实现。 示例代码:
pandas_df = pd.read_csv("file.csv")
pandas_df = pandas_df.replace({r'\\r': ''}, regex=True)
pandas_df = pandas_df.replace({r'\\n': ''}, regex=True)

您可以使用上述代码片段替换任何特殊字符。

随后,您可以根据需要将pandas_df转换为spark_df。

spark_df = sqlContext.createDataFrame(pandas_df)

11
只有在你能够使用pandas在本地机器上完整读取文件时,这个方法才有效。 - klucar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接