通过 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 数据框创建配置单元管理的分区表并为每个运行附加数据的主要内容,如果未能解决你的问题,请参考以下文章