【问题标题】:How can spark write (create) a table in hive as external in HDP 3.1如何在 HDP 3.1 中作为外部在 hive 中写入(创建)表
【发布时间】:2020-02-13 10:27:29
【问题描述】:

默认

spark-shell --conf spark.hadoop.metastore.catalog.default=hive
val df:Dataframe = ...
df.write.saveAsTable("db.table") 

在尝试写入内部/托管/事务表时失败(请参阅How to write a table to hive from spark without using the warehouse connector in HDP 3.1)。

如何告诉 spark 不创建托管表,而是创建外部表?

【问题讨论】:

  • 您是否尝试将 DataFrame 映射为 SQL“TempView”,然后运行诸如 CREATE EXTERNAL TABLE ... AS SELECT ... 之类的 SQL 命令?
  • 有没有办法为具有数百列的数据框自动执行此操作?我不确定是否会自动将 spark 类型映射到 hive 类型。
  • SELECT * 自 SQL 诞生之初就已经存在...我希望 Hive 和 Spark 支持这样一个基本功能。
  • 也可以指定Hive ACID不支持的文件格式,比如Parquet。
  • 但是我不必先为创建表指定一个模式作为选择吗?还有我不确定映射类型。

标签: apache-spark hive apache-spark-sql cloudera hdp


【解决方案1】:

现在默认禁用事务表对我来说是最好的选择。

在 Ambari 内部,只需禁用默认创建事务表的选项即可解决我的问题。

两次设置为 false (tez, llap)

hive.strict.managed.tables = false

并根据需要在每个 table property 中手动启用(以使用事务表)。

作为一种解决方法,使用手动 CTAS 也是一种选择。

【讨论】:

  • 事实证明,这不是一个理想的答案:只有 parquet 文件可以正常工作,对于 ORC,我仍然得到:java.lang.IllegalArgumentException: bucketId out of range: -1 (state=,code=0)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多