Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pyspark 用partitionby写拼花地板,而不是只写一个环_Pyspark_Apache Spark Sql_Hdfs - Fatal编程技术网

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")