我在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等,但是我对此感到困惑。 如何解决此错误?
答案 0 :(得分:0)
对于转换后的输入为新输出的此类操作,我会非常小心。这样做的原因是,如果发生任何错误,您可能会丢失数据。假设您的转换逻辑有错误,并且生成了无效数据。但是您只在一天后看到了。此外,要修复该错误,您不能使用刚刚转换的数据。转换之前需要数据。您如何做才能使数据再次保持一致?
另一种方法是:
如果您希望使用自己的解决方案,为什么不这样做而不是处理检查点呢?
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(...)
来带来有效的数据版本。