在分区 hive 表中插入 spark Dataframe 而不会覆盖数据

Posted

技术标签:

【中文标题】在分区 hive 表中插入 spark Dataframe 而不会覆盖数据【英文标题】:Insert spark Dataframe in partitioned hive table without overwrite the data 【发布时间】:2019-09-25 14:55:18 【问题描述】:

我有一个从分区表创建的数据框。

我需要将此数据框插入到已创建的分区 hive 表中,而不会覆盖以前的数据。

我使用partitionBy("columnname"),insertInto("hivetable") 但它给了我 partitionBy 和 intsertInto 不能同时使用的问题。

【问题讨论】:

你试过用saveAsTable代替insertInto吗? 我尝试使用另存为表格,但它显示表格已经存在,并且出现了 parqute 和 hive 表格甲酸盐问题 【参考方案1】:

partitionBy 不能与 insertInto 运算符一起使用。 PartitionBy 将现有数据分区为多个 hive 分区。 insertInto 用于将数据插入到预定义的分区中。

因此,你可以这样做

spark.range(10)
.withColumn("p1", 'id % 2)
.write
.mode("overwrite")
.partitionBy("p1")
.saveAsTable("partitioned_table")

val insertIntoQ = sql("INSERT INTO TABLE 
partitioned_table PARTITION (p1 = 4) VALUES 41, 42")

如果您需要动态添加分区,则需要设置hive.exec.dynamic.partition

hiveContext.setConf("hive.exec.dynamic.partition", "true")

hiveContext.setConf("hive.exec.dynamic.partition.mode", "nonstrict")

我在数据摄取过程中遇到了类似的问题,我做了类似的事情

df.write().mode(SaveMode.Append).partitionBy("colname").saveAsTable("Table")

【讨论】:

【参考方案2】:

当您使用 insertInto 时,无需在代码中添加 PartitionBy 或 BucketBy。这应该在表创建请求中定义。

【讨论】:

以上是关于在分区 hive 表中插入 spark Dataframe 而不会覆盖数据的主要内容,如果未能解决你的问题,请参考以下文章

获取 Spark 写入 Hive 元存储的所有新分区

Spark 不使用 Hive 分区外部表中的分区信息

如何使用 Spark SQL 识别 hive 表中的分区列

将 Spark 数据帧保存为 Hive 中的动态分区表

Spark 是不是支持插入覆盖静态分区?

Hive:无法在具有 100 个或更多分区列的表中插入数据错误:在最大长度为 767 的列“PART_NAME”中