说明
首先调整配置信息
spark.conf.set("spark.sql.sources.partitionOverwriteMode","dynamic")
在写入分区表的时候,一定要注意字段顺序,需要把分区字段放到最后,且如果有多个字段分区的话,顺序也要对应。
def re_arrange_partition_columns(df,partition_columns):
'''
df : 输入的df,spark.DataFrame类型
partition_columns : list,分区字段,有顺序要求
'''
column_list = []
for column in df.schema.name:
if column not in partition_columns:
column_list.append(column)
column_list.extend(partition_columns)
df = df.select(column_list)
return df
示例
接下来演示动态分区数据的写入
建表
drop table if exists orders;
create table if not exists orders(
id int,
sku string,
qty int
)
using parquet
partitioned by (year int,month int)
生成模拟数据
import pandas as pd
df = pd.DataFrame({
'id':[1,2,3,4],
'sku':['a','b','c','d'],
'qty':[1,3,5,7],
'year':[2020,2021,2022,2021],
'month':[3,5,7,9]
})
spark.createDataFrame(df).createOrReplaceTempView('df_order')
df

设置动态分区&写入数据
spark.conf.set("spark.sql.sources.partitionOverwriteMode","dynamic")
sqlstr = '''
insert overwrite orders
select *
from df_order
'''
spark.sql(sqlstr)

1574

被折叠的 条评论
为什么被折叠?



