首先嘹裂,寫(xiě)入動(dòng)態(tài)分區(qū)表盲泛,要設(shè)置一些嚴(yán)格模式的參數(shù)濒持,將其設(shè)置為非嚴(yán)格模式
.config("hive.exec.dynamic.partition.mode", "nonstrict")
插入非分區(qū) Hive 表
df_tb = spark.sql("select a,b from source_table")
df_tb.repartition(2).write.insertInto("table_name",overwrite=False)
對(duì)于插入 Hive 表來(lái)說(shuō)键耕,這個(gè)重分區(qū)不是必須的,但是建議使用柑营,這樣可以控制插入的 Hive 表中的文件個(gè)數(shù)屈雄。
動(dòng)態(tài)插入分區(qū)表
create table source(
id string,
pdt string,
)
partitioned by (day string) ;
df_tb = spark.sql("select pdt, id, pdt from source")
df_tb.repartition(2).write.insertInto("table_name",overwrite=False)
是的,插入表的語(yǔ)法是一樣的官套。只不過(guò)前面查詢的時(shí)候酒奶,要把分區(qū)字段放在最后一個(gè)查詢位置,這和 Hive 的動(dòng)態(tài)分區(qū)插入是一樣的奶赔。
我一般使用 df 算子的方式插入表惋嚎,而不使用在 sql 中寫(xiě) insert into 的方式。 因?yàn)檫@種方式可以更好的控制生成的文件數(shù)站刑。而使用 insert into 的方式瘸彤,文件數(shù)會(huì)等于 shuffle 的分區(qū)數(shù)。 為了計(jì)算性能笛钝,shuffle 的分區(qū)數(shù)不會(huì)設(shè)置的太小,但是最終結(jié)果可能數(shù)量并不大愕宋,沒(méi)必要生成這么多文件玻靡。所以我一般會(huì)使用算子的方式插入 Hive 表。