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

ajsxfq5m  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(378)

如果源数据有新列,我将尝试在配置单元表中添加列。所有新列的检测工作正常,但是,当我尝试将该列添加到目标表时,收到以下错误:

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.)

但是,如果我捕获生成的alter语句并从hivegui(hue)执行它,我就可以添加它而不会出现问题。

alter table dbo_nwd_orders add columns (newCol int)

为什么这句话在gui中有效,而不是在spark代码中有效?
非常感谢你。

omjgkv6w

omjgkv6w1#

这里已经说过多次了,但只是重申一下——spark不是hive接口,在语言(spark以sql标准为目标,hive使用类似sql的自定义查询语言)或功能(spark是etl解决方案,hive是数据仓库解决方案)方面也不是为完全的hive兼容性而设计的。
即使数据布局在这两者之间也不完全兼容。
spark with hive support是spark with access to hive metastore,而不是spark的行为类似于hive。
如果您需要访问配置单元的全套功能,请使用本机客户端或本机(而不是spark)jdbc连接直接连接到配置单元,并从那里使用interact。

相关问题