Table 通过 Spark 加载无法在 Hive 中访问

Table loaded through Spark not accessible in Hive

无法从 Hive 访问通过 Spark (pyspark) 创建的 Hive table。

df.write.format("orc").mode("overwrite").saveAsTable("db.table")

从 Hive 访问时出错:

Error: java.io.IOException: java.lang.IllegalArgumentException: bucketId out of range: -1 (state=,code=0)

Table 在 Hive 中成功创建并能够在 spark 中读取此 table。 Table 元数据可访问(在 Hive 中),数据文件在 table(在 hdfs 中)目录中。

Hive table 的 TBLPROPERTIES 是:

  'bucketing_version'='2',                         
  'spark.sql.create.version'='2.3.1.3.0.0.0-1634', 
  'spark.sql.sources.provider'='orc',              
  'spark.sql.sources.schema.numParts'='1',

我还尝试使用其他解决方法创建 table,但在创建 table 时出现错误:

df.write.mode("overwrite").saveAsTable("db.table")

df.createOrReplaceTempView("dfTable")
spark.sql("CREATE TABLE db.table AS SELECT * FROM dfTable")

错误:

AnalysisException: u'org.apache.hadoop.hive.ql.metadata.HiveException: MetaException(message:Table default.src failed strict managed table checks due to the following reason: Table is marked as a managed table but is not transactional.);'

堆栈版本详细信息:

Spark2.3

Hive3.1

Hortonworks 数据平台 HDP3.0

从 HDP 3.0 开始,Apache Hive 和 Apache Spark 的目录是分开的,它们使用自己的目录;也就是说,它们是互斥的——Apache Hive 目录只能被 Apache Hive 或这个库访问,而 Apache Spark 目录只能被 Apache Spark 中现有的 API 访问。换句话说,一些功能,如 ACID tables 或 Apache Ranger with Apache Hive table 只能通过 Apache Spark 中的这个库获得。 Hive 中的那些 table 不应在 Apache Spark API 本身中直接访问。

  • 下面的文章解释了这些步骤:

Integrating Apache Hive with Apache Spark - Hive Warehouse Connector

设置以下属性后我遇到了同样的问题,它工作正常。

set hive.mapred.mode=nonstrict;
set hive.optimize.ppd=true;
set hive.optimize.index.filter=true;
set hive.tez.bucket.pruning=true;
set hive.explain.user=false; 
set hive.fetch.task.conversion=none;
set hive.support.concurrency=true;
set hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;