保存到 CSV 时 Spark 写入额外的行

Spark writing extra rows when saving to CSV

我写了一个包含 1,000,000 行的 parquet 文件。
当我读回 parquet 文件时,结果是 1,000,000 行。

df = spark.read.parquet(parquet_path)
df.count()
>>> 1000000

当我将 parquet 文件保存为 CSV 时,读回它,然后计算行数,输出为 1,000,365。

df.write.csv(csv_path, sep='\t', header=False, mode='overwrite')
df_csv = spark.read.csv(csv_path, sep='\t', header=False)
df_csv.count()
>>> 1000365

为什么 Spark 向数据集添加额外的列?
我尝试了多种分隔符,FalseTrue 都用于 header。
我也尝试合并和重新分区,但不断出现相同的数字。

有谁知道为什么 Spark 会添加额外的列?

读取包含换行符的 csv 文件时会发生这种情况。默认情况下,换行符将拆分为多条记录。

要正确读取多行 csv,您需要首先确保该字段被正确引用。

1,short text,"long text with newline\n quote within this field should be \"escaped\"."

虽然双引号是默认值,但引号字符可以是双引号以外的其他字符。

在此处检查默认的 csv 选项:https://spark.apache.org/docs/latest/sql-data-sources-csv.html

然后,当您阅读此包含换行符 (\n) 的 csv 时。您需要添加 multiLine=True 选项。

spark.read.csv(csv_path, multiLine=True)

# or

spark.read.option('multiLine', True).csv(csv_path)