首先,写入动态分区表,要设置一些严格模式的参数,将其设置为非严格模式
.config("hive.exec.dynamic.partition.mode", "nonstrict")
插入非分区 Hive 表
df_tb = spark.sql("select a,b from source_table")
df_tb.repartition(2).write.insertInto("table_name",overwrite=False)
对于插入 Hive 表来说,这个重分区不是必须的,但是建议使用,这样可以控制插入的 Hive 表中的文件个数。
动态插入分区表
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)
是的,插入表的语法是一样的。只不过前面查询的时候,要把分区字段放在最后一个查询位置,这和 Hive 的动态分区插入是一样的。
我一般使用 df 算子的方式插入表,而不使用在 sql 中写 insert into 的方式。 因为这种方式可以更好的控制生成的文件数。而使用 insert into 的方式,文件数会等于 shuffle 的分区数。 为了计算性能,shuffle 的分区数不会设置的太小,但是最终结果可能数量并不大,没必要生成这么多文件。所以我一般会使用算子的方式插入 Hive 表。