PySpark - 分区

时间:2018-03-01 22:10:46

标签: pyspark spark-dataframe hive-partitions

我看到的情况是,当将pyspark数据帧保存到具有多列分区的hive表时,它也会覆盖子分区中的数据。或者 - 可能是我假设它是一个子分区。

我想对列#39;月'作为子分区。这样,当我将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 个答案:

答案 0 :(得分:0)

似乎你误解了分区的概念。

这不是您在SQL语句中遇到的窗口函数分区;它反而指的是数据在内存或文件系统中的存储和引用方式。 Here's a helpful introduction.

更改Spark数据框的分区将永远更改该数据框中的行数。