pyspark - 用 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')
这是可行的,因为如果我运行脚本,它只会覆盖特定文件夹/日/国家/地区中的文件,感觉很不对劲。有更好的选择吗?
解决方案
如果您使用的是 spark 2.3 或更高版本,则可以创建分区表并将 spark.sql.sources.partitionOverwriteMode 设置为动态
spark.conf.set("spark.sql.sources.partitionOverwriteMode","dynamic")
df.write.mode("overwrite").insertInto("yourtable")
推荐阅读
- xpages - 未显示服务器端javascript的Lotus domino xpages全局对象
- continuous-integration - gitlab.com 项目概览页面上的存储含义和配额
- java - 我是否正确实施了广告,为什么没有显示?
- excel - “@”添加到使用 INDIRECT 公式的每一行
- reactjs - 有没有办法对钩子依赖项提出要求?
- r - 我可以一次提取一个多边形的光栅像素频率并保存,以避免在 R 中使我的 RAM 过载吗?
- reactjs - 如何强制刷新甘特图
- sql - 如何将 Postgresgl 的 ArrayField ANY 选项与 LIKE 结合使用
- javascript - 使用 supertest 启动和停止服务器
- android - 如何在android中创建带有上行数据的seekbar?