PySpark - 分区中覆盖的数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PySpark - 分区中覆盖的数据相关的知识,希望对你有一定的参考价值。

我看到一种情况,当一个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|
+---+---+----+-----+
答案

看起来你误解了分区的概念。

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

更改Spark数据帧的分区永远不会改变该数据帧中的行数。

以上是关于PySpark - 分区中覆盖的数据的主要内容,如果未能解决你的问题,请参考以下文章

通过 pyspark 数据框创建配置单元管理的分区表并为每个运行附加数据

用修改后的 PySpark DataFrame 覆盖现有 Parquet 数据集

Pyspark 数据框 OrderBy 分区级别还是整体?

如何从 BigQuery 读取分区表到 Spark 数据帧(在 PySpark 中)

重新分区 pyspark 数据帧失败以及如何避免初始分区大小

Pyspark 数据帧重新分区将所有数据放在一个分区中