更新取决于自己的数据的镶木地板文件的最佳方法

Posted

技术标签:

【中文标题】更新取决于自己的数据的镶木地板文件的最佳方法【英文标题】:Best way of updating a parquet file that depends on it's own data 【发布时间】:2017-05-30 14:07:05 【问题描述】:

我有一个 parquet 文件,其中按用户存储了许多指标。 到目前为止,我已经完全重新计算了这个文件,但是计算很复杂,所以我只想覆盖特定的列。

有两种方法:

添加新行 添加列

因此,例如在添加新行时,我想做这样的事情:

df_old = sqlContext.read.parquet(myfile)
df_new = df_other_src.select(...)
df_new = df_old.alias("o").join(df_new.alias("n"), "o.id == n.id", "right")\
  .where("o.id is NULL").select("n.id")
df_new.write.parquet(myfile,mode="append")

问题在于这不起作用,因为df_new 依赖于df_old。解决这个问题的最佳方法是什么?

【问题讨论】:

【参考方案1】:

几天前我遇到了这个问题。所以我做的是

    读取旧 parquet 文件和新数据 合并这些数据并创建新的 Dataframe 将此 Dataframe 写入任何临时目录中 删除旧目录并将临时目录重命名为旧目录

如果我不这样做,每次作业运行时都会创建很多空文件。

我希望这也能为您提供想法。

【讨论】:

是的,我明白了,但我真的希望我不需要走那条路。我知道,如果我创建另一个列,例如 date_addedwrite 使用 mode="append", partitionBy="date_added ' 的文件,它应该可以工作,但我真的不想添加人工列。 是的,如果您只是添加一列,那么只需保存附加模式即可。 只是附加时它对我不起作用。如果我按特定分区尚不存在的列添加和分区,它似乎是可靠的(经过 1000 次迭代测试)。

以上是关于更新取决于自己的数据的镶木地板文件的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

读取列中具有混合数据类型的镶木地板文件

即使存在与之关联的镶木地板文件,Hive 外部表也不显示任何数据

AWS Spectrum 为 AWS Glue 生成的镶木地板文件提供空白结果

无法使用 Pyspark 2.4.4 读取 s3 存储桶中的镶木地板文件

附加时的镶木地板文件保护

Py4JJavaError:在尝试将 rdd 数据帧写入本地目录上的镶木地板文件时调用 o389.parquet 时发生错误