首页 > 解决方案 > 在分区 hive 表中插入 spark Dataframe 而不会覆盖数据

问题描述

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

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

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

标签: apache-sparkhivepyspark

解决方案


您不能partitionByinsertInto运营商合作。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")

推荐阅读