我有这个怪异的错误。我有一个例程,如果存在(或者否则创建),则读取数据框,然后将其修改,然后以"覆盖"模式以parquet格式以同一目标路径保存。
在第一次运行中,当没有数据框架时,我会创建一个并保存它。它在输出文件夹4文件中生成:
- _success.crc
- part-r-< .....>。snappy.parquet.crc
- _success
- part-r-< .....>。snappy.parquet
然后,在第二次运行中,我读取数据框,修改它,当我尝试覆盖它时,会引发*part-r-<.....>.snappy.parquet file does not exist*
的例外。
发生异常时,输出文件夹为空,但是在执行df.write.parquet(path, 'overwrite')
之前,文件夹包含此文件。
我试图将spark.sql.cachemetadata设置为" false",但这无济于事。spark.catalog.listtables()返回一个空列表,因此没有意义可以刷新任何东西。
目前,我只需删除输出文件夹的项目,然后编写数据框。有用。但是,为什么使用"覆盖"模式的原始方法失败了?
谢谢。
rdd不像变量那样持有数据诉讼称为。
所以你在这里做的是
1st time => ... =>保存到路径a
第二次开始=> 从路径A =>读取一些转换=> 保存到路径A具有覆盖模式
现在注意,您的实际操作是保存到路径。UTIL您称之为操作,Spark只会创建DAG,该DAG知道何时将呼唤一个动作以查找数据(保存到路径A),如何转换它们以及在哪里保存/显示。
但是,当您选择模式覆盖时,在执行计划中添加以首先删除路径,然后尝试读取已经空置的路径。
因此,作为解决方法,您可以保存它们的不同文件夹,例如分区基础,也可以将它们保存在两个路径一个目标和一个TMP中。
在这里要做的另一件事是缓存它 -
df.cache()
从HDFS阅读后。