我看到一种情况,当一个pyspark数据帧保存到具有多列分区的hive表时,它也会覆盖子分区中的数据 . 或者 - 可能是我假设它是一个子分区 .
我想将列'月'视为子分区 . 这样,当我将df2保存到同一个表时,我可以看到4条记录(在hive表中)而不是2条记录 .
mode=append
会奏效 . 但是,如果年份和月份相同,我希望覆盖数据 . 保存pyspark数据帧时有没有办法做到这一点?
>>> df1 = spark.sql('select * from test_input')
>>> df1.show()
+---+---+----+-----+
| f1| f2|year|month|
+---+---+----+-----+
| a| b|2018| 01|
| c| d|2018| 01|
+---+---+----+-----+
>>> df1.write.saveAsTable('test_output',mode='overwrite',partitionBy=('year','month'))
>>> spark.sql('select * from test_output').show()
+---+---+----+-----+
| f1| f2|year|month|
+---+---+----+-----+
| a| b|2018| 01|
| c| d|2018| 01|
+---+---+----+-----+
>>> df2 = spark.sql('select * from test_input')
>>> df2.show()
+---+---+----+-----+
| f1| f2|year|month|
+---+---+----+-----+
| a| b|2018| 02|
| c| d|2018| 02|
+---+---+----+-----+
>>> df2.write.saveAsTable('test_output',mode='overwrite',partitionBy=('year','month'))
>>> spark.sql('select * from test_output').show()
+---+---+----+-----+
| f1| f2|year|month|
+---+---+----+-----+
| a| b|2018| 02|
| c| d|2018| 02|
+---+---+----+-----+
1 回答
看起来你误解了分区的概念 .
这不是您在SQL语句中遇到的窗口函数分区;它反而指的是数据在内存或文件系统中的存储和引用方式 . Here's a helpful introduction.
更改Spark数据帧的分区将改变该数据帧中的行数 .