首页 > 解决方案 > 用 partitionby 写实木复合地板与只是一个循环

问题描述

假设有一个脚本每周在 2 个分区中写入 parquet 文件:DAY 和 COUNTRY,在一个文件夹中。
解决方案 1:

   df.write.parquet(FOLDER, mode='overwrite',
                     partitionBy=['DAY', 'COUNTRY'])

这样做的问题是,如果以后由于该分区中的数据损坏而只想针对特定国家和日期重新运行脚本,它将删除整个文件夹的内容,并仅写入特定日期/国家/地区的数据。APPEND 也不能解决它,它只会将正确的数据附加到错误的数据上。
理想的情况是,如果上述命令仅覆盖 df 具有的 DAY/COUNTRY 组合。

解决方案2:
制作一个循环:

for country in countries:
       for day in days:
            df.write.parquet(FOLDER/day/country, mode='overwrite')

这是可行的,因为如果我运行脚本,它只会覆盖特定文件夹/日/国家/地区中的文件,感觉很不对劲。有更好的选择吗?

标签: pysparkapache-spark-sqlhdfs

解决方案


如果您使用的是 spark 2.3 或更高版本,则可以创建分区表并将 spark.sql.sources.partitionOverwriteMode 设置为动态

spark.conf.set("spark.sql.sources.partitionOverwriteMode","dynamic")
df.write.mode("overwrite").insertInto("yourtable")


推荐阅读