首页 > 解决方案 > 以 parquet 格式存储 Spark 数据帧时丢失数据

问题描述

我有一个可以加载到 pyspark 中的 csv 数据文件:

spark = SparkSession.builder.master("local").appName("MYAPP").getOrCreate()```

df = spark.read.csv( path = csvfilepath, sep="|", schema=my_schema, nullValue="NULL", mode="DROPMALFORMED")```

检查数据框的行数会得到大约 2000 万行。

df.count()

我将数据框重新存储在镶木地板中:

df.write.mode("overwrite").parquet( parquetfilepath )

然后我加载镶木地板数据:

df = spark.read.parquet( parquetfilepath )

现在,当我计算行数 ( df.count()) 时,我只得到 300 万行。

为什么我丢失了 85% 的行,我该如何解决这个问题?在创建具有相同结果的镶木地板数据时,我还尝试使用“重新分区”和“合并”。

标签: apache-sparkpysparkparquet

解决方案


我正在回答我自己的问题,因为我现在已经理解了问题所在。这实际上是一个非常简单的初学者错误。我丢失数据的原因仅仅是因为我在使用选项 mode="DROPMALFORMED" 读取 df 时要求提供它。当我计算日期框架的行时,我发现它是 2000 万行,但其中一些与架构不一致,并且在数据实际写入磁盘时被删除(即删除我在读取 csv 已被推迟到这一点)。我没有意识到我的数据中有错误。


推荐阅读