apache-spark - 在分区 hive 表中插入 spark Dataframe 而不会覆盖数据
问题描述
我有一个从分区表创建的数据框。
我需要将此数据框插入到已创建的分区配置单元表中,而不会覆盖以前的数据。
我使用partitionBy("columnname"),insertInto("hivetable")
但它给了我 partitionBy 和 intsertInto 不能同时使用的问题。
解决方案
您不能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")
推荐阅读
- css - bootstrap 4 flex 行并排出现
- reactjs - 无法调用 `bindActionCreators`,因为 `Action` [1] 与 `ActionCreator` 不兼容
- spring - 休眠会话工厂始终为空
- python - 无法在 Mac 上使用 Python 3.7 通过 pip 安装 Scikit-Learn
- javascript - 如何编写任意长的 Promise 链
- python - 从上述文件夹导入模块不适用于 CI 服务器
- python - 考虑引号的字符串拆分
- vba - 如何从列中查找特定文本并仅一一删除多行中的该文本
- spring - 考虑将其中一个 bean 标记为 @Primary,更新使用者以接受多个 bean,或者使用 @Qualifier 来识别应该是的 bean
- php - 如何使用循环或函数简化此代码?