scala/spark 代码中不允许在配置单元中添加列

Posted

技术标签:

【中文标题】scala/spark 代码中不允许在配置单元中添加列【英文标题】:Add column in hive not allowed from scala/spark code 【发布时间】:2018-06-08 10:11:14 【问题描述】:

如果源数据有新列,我正在尝试在 Hive 表中添加一列。新列的所有检测工作正常,但是,当我尝试将列添加到目标表时,我收到此错误:

for (f <- df.schema.fields) 
  if ("[" + f.name + "]"==chk) 
    spark.sqlContext.sql("alter table dbo_nwd_orders add columns (" + f.name + " " + f.dataType.typeName.replace("integer", "int") + ")")
  

错误:

WARN HiveExternalCatalog: Could not alter schema of table  `default`.`dbo_nwd_orders` in a Hive compatible way. Updating Hive metastore in Spark SQL specific format
InvalidOperationException(message:partition keys can not be changed.)

但是,如果我捕获生成的更改语句并从 hive GUI (HUE) 执行它,我可以毫无问题地添加它。

alter table dbo_nwd_orders add columns (newCol int)

为什么这句话在 GUI 中有效,而不是在 spark 代码中有效?

非常感谢。

【问题讨论】:

【参考方案1】:

这里已经说过多次了,但只是重申一下 - Spark 不是 Hive 接口,并且在语言(Spark 针对 SQL 标准,Hive 使用自定义的类似 SQL 的查询语言)或功能方面不是为完全 Hive 兼容性而设计的(Spark 是 ETL 解决方案,Hive 是数据仓库解决方案)。

这两者之间甚至数据布局也不完全兼容。

支持 Hive 的 Spark 是可以访问 Hive 元存储的 Spark,而不是行为类似于 Hive 的 Spark。

如果您需要访问 Hive 的全套功能,请使用本机客户端或本机(非 Spark)JDBC 连接直接连接到 Hive,并从那里与之交互。

【讨论】:

感谢您的回复,我认为 spark.sql("query") 是一种明确的 hive 直通,但似乎不是(这是一个小问题......)

以上是关于scala/spark 代码中不允许在配置单元中添加列的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Scala(spark) 中打印字符串或字符串 [Array]?

在scala./Spark代码中获取NullPointerException

从 Scala Spark 代码调用 Pyspark 脚本

我们可以编写 Scala/Spark 通用动态编写的代码吗

Scala/Spark 选择列非常慢

spark学习进度1