使用检查点数据框覆盖表失败,并出现FileNotFoundException

时间:2019-06-27 11:32:14

标签: python apache-spark pyspark pyspark-sql spark-checkpoint

我在pySpark中有一些数据帧df,这是由于调用:

df = spark.sql("select A, B from org_table")
df = df.stuffIdo

我想在脚本末尾覆盖org_table。 由于禁止覆盖输入表,因此我对数据进行了检查:

sparkContext.setCheckpointDir("hdfs:/directoryXYZ/PrePro_temp")
checkpointed = df.checkpoint(eager=True)

现在应该打破沿袭了,我还可以使用checkpointed.show()查看我的检查点数据(有效)。写表是行不通的:

checkpointed.write.format('parquet')\
    .option("checkpointLocation", "hdfs:/directoryXYZ/PrePro_temp")\
    .mode('overwrite').saveAsTable('org_table')

这会导致错误:

  

由以下原因引起:java.io.FileNotFoundException:文件不存在:hdfs://org_table_path/org_table/part-00081-4e9d12ea-be6a-4a01-8bcf-1e73658a54dd-c000.snappy.parquet

我已经尝试过几项工作,例如在进行写作之前刷新org_table等,但是我对此感到困惑。 如何解决此错误?

1 个答案:

答案 0 :(得分:0)

对于转换后的输入为新输出的此类操作,我会非常小心。这样做的原因是,如果发生任何错误,您可能会丢失数据。假设您的转换逻辑有错误,并且生成了无效数据。但是您只在一天后看到了。此外,要修复该错误,您不能使用刚刚转换的数据。转换之前需要数据。您如何做才能使数据再次保持一致?

另一种方法是:

  • 公开视图
  • 每批您要编写一个新表,最后只用该新表替换视图
  • 几天后,您还可以计划执行清洁工作,该工作将删除最近X天中的表格

如果您希望使用自己的解决方案,为什么不这样做而不是处理检查点呢?

df.write.parquet("hdfs:/directoryXYZ/PrePro_temp")\
    .mode('overwrite')

df.load("hdfs:/directoryXYZ/PrePro_temp").write.format('parquet').mode('overwrite').saveAsTable('org_table')

当然,您将读取两次数据,但看起来比带有检查点的数据更不容易破解。此外,您每次都可以将“中间”数据存储在不同的目录中,因此您可以解决我一开始就提到的问题。即使您有错误,也可以通过选择一个合适的目录并对org_table做.write.format(...)来带来有效的数据版本。