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

Posted

技术标签:

【中文标题】通过 pyspark 数据框创建配置单元管理的分区表并为每个运行附加数据【英文标题】:Create hive managed partitioned table through pyspark dataframe and append data for everyrun 【发布时间】:2021-09-17 15:18:14 【问题描述】:

我有一个 spark 数据框,我正在尝试在 hive 中创建一个分区表。

我有一个标志来说明表是否存在。第一次运行应该创建表,从第二次运行开始,数据应该被插入到表中而不覆盖现有数据。

我的问题是如何创建分区表并插入到已经存在的分区表中而不覆盖现有数据。

该表由一个名为 date 的列进行分区。

到目前为止我尝试了什么。(没有分区)

df.createOrReplaceTempView("df_view")
if table_exists:
   spark.sql("insert into mytable select * from df_view")
else:
   spark.sql("create table if not exists mytable as select * from df_view")

但我必须对分区列执行相同的操作 - 日期。

同一日期可以有多次运行。那么是否可以将数据附加到同一分区而不是覆盖它。

预期输出: 第一次运行后:创建表时应使用分区列作为日期。

Name date        timestamp
A.   2021-09-16  2021-09-16 12:00:01
B.   2021-09-16  2021-09-16 12:00:01

在同一日期第二次运行后:(数据应附加到同一分区)

Name date        timestamp
A.   2021-09-16  2021-09-16 12:00:01
B.   2021-09-16  2021-09-16 12:00:01
A.   2021-09-16  2021-09-16 12:20:01
B.   2021-09-16  2021-09-16 12:20:01

下一个日期第三次运行:(新分区应保留所有现有数据)

Name date        timestamp
A.   2021-09-16  2021-09-16 12:00:01
B.   2021-09-16  2021-09-16 12:00:01
A.   2021-09-16  2021-09-16 12:20:01
B.   2021-09-16  2021-09-16 12:20:01
A.   2021-09-17  2021-09-17 12:20:01
B.   2021-09-17  2021-09-17 12:20:01

如何在 Pyspark 中实现这一点。

【问题讨论】:

为什么不用write + append 模式? 好的..创建带分区的配置单元表时如何追加 我可以在没有spark.sql()的情况下使用pyspark回答吗? 是的。请。只要是 pyspark 就可以了 【参考方案1】:

在documentation 之后,您的代码可能是这样的:

df.write.saveAsTable('[table_name_here]', 
                     format='[format_here]', 
                     mode='append', 
                     partitionBy='date')

此代码无需检查表是否存在,append 不存在时自动创建。

【讨论】:

【参考方案2】:

您可以运行parts = spark.sql('show partitions mytable'),甚至将其转换为 Python 列表或 Pandas 并检查分区是否存在

【讨论】:

谢谢。但我的问题更多与创建分区和将数据附加到分区有关

以上是关于通过 pyspark 数据框创建配置单元管理的分区表并为每个运行附加数据的主要内容,如果未能解决你的问题,请参考以下文章

PySpark - 遍历每一行数据帧并运行配置单元查询

如何使用其模式从 Pyspark 数据框创建配置单元表?

带有 hive 的 pyspark - 无法正确创建分区并从数据框中保存表

如何在 pyspark 中加入带有熊猫数据框的配置单元表?

Pyspark OLD 数据框分区到新数据框

pyspark 使用名称中的变量将数据框保存到配置单元表