apache-spark - 以 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% 的行,我该如何解决这个问题?在创建具有相同结果的镶木地板数据时,我还尝试使用“重新分区”和“合并”。
解决方案
我正在回答我自己的问题,因为我现在已经理解了问题所在。这实际上是一个非常简单的初学者错误。我丢失数据的原因仅仅是因为我在使用选项 mode="DROPMALFORMED" 读取 df 时要求提供它。当我计算日期框架的行时,我发现它是 2000 万行,但其中一些与架构不一致,并且在数据实际写入磁盘时被删除(即删除我在读取 csv 已被推迟到这一点)。我没有意识到我的数据中有错误。
推荐阅读
- vue.js - 通过插槽 Vue 3 访问 Vue 组件
- javascript - 如何在 NextJS 应用程序中使用 SWR 呈现来自 GraphQL 的 Apollo Server 实例的数据?
- ios - React Native Detox - 本地和 CI 有不同的结果
- c# - 打字稿 下载 PDF 文件
- .net - 使用 GitHub Actions 在 .net 应用程序中填充特定于环境的变量
- python - Errno 22 文件路径的参数无效
- sql - Redshift - 断言代码:SELECT column1 FROM my.view 上的 1000,但不在 SELECT * FROM my.view 上
- c - 如果它们的数量由输入而不是由变量确定,我如何加载然后打印多个数字
- python - 从字符串变量创建列表
- python - 如何根据analyze_recording()的“分析”中包含的信息在psynet中试用后显示自定义反馈?