Pyspark 用partitionby写拼花地板,而不是只写一个环
让我们假设有一个脚本,它每周在一个文件夹中的两个分区(日期和国家)中编写一个拼花地板文件。Pyspark 用partitionby写拼花地板,而不是只写一个环,pyspark,apache-spark-sql,hdfs,Pyspark,Apache Spark Sql,Hdfs,让我们假设有一个脚本,它每周在一个文件夹中的两个分区(日期和国家)中编写一个拼花地板文件。 解决方案1: df.write.parquet(FOLDER, mode='overwrite', partitionBy=['DAY', 'COUNTRY']) 问题是,如果以后由于分区中的数据损坏而仅针对特定的国家/地区和日期重新运行脚本,它将删除整个文件夹的内容,并仅针对特定的日期/国家/地区写入数据。 追加也不能解决这个问题,它只会将正确的数据追加
解决方案1:
df.write.parquet(FOLDER, mode='overwrite',
partitionBy=['DAY', 'COUNTRY'])
问题是,如果以后由于分区中的数据损坏而仅针对特定的国家/地区和日期重新运行脚本,它将删除整个文件夹的内容,并仅针对特定的日期/国家/地区写入数据。
追加也不能解决这个问题,它只会将正确的数据追加到错误的数据中。理想的情况是,如果上述命令只重写了df拥有的日期/国家组合 解决方案2:
做一个循环:
for country in countries:
for day in days:
df.write.parquet(FOLDER/day/country, mode='overwrite')
这是可行的,因为如果我运行脚本,它只会覆盖特定文件夹/day/country中的文件,感觉非常错误。有更好的选择吗?如果您使用的是spark 2.3或更高版本,您可以创建分区表并 将spark.sql.sources.partitionOverwriteMode设置设置为动态
spark.conf.set("spark.sql.sources.partitionOverwriteMode","dynamic")
df.write.mode("overwrite").insertInto("yourtable")
如果您使用的是spark 2.3或更高版本,则可以创建分区表并 将spark.sql.sources.partitionOverwriteMode设置设置为动态
spark.conf.set("spark.sql.sources.partitionOverwriteMode","dynamic")
df.write.mode("overwrite").insertInto("yourtable")