保存到 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 向数据集添加额外的列?
我尝试了多种分隔符,False
和 True
都用于 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)
我写了一个包含 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 向数据集添加额外的列?
我尝试了多种分隔符,False
和 True
都用于 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)