PySpark - 分区中覆盖的数据
PySpark - data overwritten in Partition
我看到这样一种情况,当将 pyspark 数据帧保存到具有多列分区的配置单元 table 时,它也会覆盖子分区中的数据。或者 - 可能是我假设它是一个子分区。
我想将列 'month' 视为子分区。因此,当我将 df2 保存到相同的 table.
时,我可以看到 4 条记录(在配置单元 table 中)而不是 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|
+---+---+----+-----+
看来你对分区的概念理解有误
这不是您在 SQL 语句中遇到的 window 函数分区;相反,它指的是数据在内存或文件系统中的存储和引用方式。 Here's a helpful introduction.
更改 Spark 数据帧的分区将永远不会改变该数据帧中的行数。
我看到这样一种情况,当将 pyspark 数据帧保存到具有多列分区的配置单元 table 时,它也会覆盖子分区中的数据。或者 - 可能是我假设它是一个子分区。
我想将列 'month' 视为子分区。因此,当我将 df2 保存到相同的 table.
时,我可以看到 4 条记录(在配置单元 table 中)而不是 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|
+---+---+----+-----+
看来你对分区的概念理解有误
这不是您在 SQL 语句中遇到的 window 函数分区;相反,它指的是数据在内存或文件系统中的存储和引用方式。 Here's a helpful introduction.
更改 Spark 数据帧的分区将永远不会改变该数据帧中的行数。