首页 > 解决方案 > 结果 csv 中的行数增加并且数据损坏

问题描述

将数据框从一种形式转换为另一种形式:

Parquet -> Parquet (number of rows remains same, NO PROBLEM)
Parquet -> CSV     (number of rows INCREASES! Data corruption!)

首先从 parquet 读取数据,然后使用以下命令转换为 csv/parquet:

<input_dataframe>.coalesce(1).write.option("header", true).csv/parquet(output_path)

scala> spark.read.option("header", true).parquet(input_path).count
Long = 8387913

scala> spark.read.option("header", true).csv(output_path).count
Long = 8387932

由于这些行相互混合,记录被溢出或损坏。

只有在您必须使用 spark读取 csv 时才有解决方法。您可以将选项传递multilinetrue.

scala> spark.read.option("header", true).option("multiline", true).csv(output_path).count
Long = 8387913     <<  input parquet contains same number of records 

但这不是我想要对 CSV 做的事情。我需要在不使用 spark 的情况下阅读它。

如何在将数据帧写入 csv时保持结构完整?

注意:这可能不是所有数据帧的可重现案例。我的数据有一些未知的原因。当我发现字符串类型字段将整数值存储在结果 CSV 中,并且一整套记录被任意值损坏时,我注意到了这个问题。CSV 大小 ~ 2.5 GB。

标签: scalacsvdataframeapache-sparkparquet

解决方案


推荐阅读