在分区 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 而不会覆盖数据的主要内容,如果未能解决你的问题,请参考以下文章