通过 Spark 加载的表在 Hive 中无法访问
Posted
技术标签:
【中文标题】通过 Spark 加载的表在 Hive 中无法访问【英文标题】:Table loaded through Spark not accessible in Hive 【发布时间】:2018-10-11 13:32:46 【问题描述】:无法从 Hive 访问通过 Spark (pyspark) 创建的 Hive 表。
df.write.format("orc").mode("overwrite").saveAsTable("db.table")
从 Hive 访问时出错:
错误:java.io.IOException:java.lang.IllegalArgumentException:bucketId 超出范围:-1 (state=,code=0)
在 Hive 中成功创建了表,并且能够在 spark 中读取该表。可以访问表元数据(在 Hive 中)和表(在 hdfs)目录中的数据文件。
Hive 表的 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',
我也尝试使用其他解决方法创建表,但在创建表时出错:
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 由于以下原因未能通过严格的托管表检查:表被标记为托管表但不是事务性的。);'
堆栈版本详情:
Spark2.3
Hive3.1
Hortonworks 数据平台 HDP3.0
【问题讨论】:
你是否设置了 hive.strict.managed.tables=true 是的,默认是这样的。 表被标记为托管表 => 内部表。在表属性中,是否可以尝试添加'transactional'='true? 我怀疑这是一个错误。 issues.apache.org/jira/browse/HIVE-20593 2018 年 9 月 26 日固定。 【参考方案1】:从 HDP 3.0 开始,Apache Hive 和 Apache Spark 的目录是分开的,它们使用自己的目录;即它们是互斥的——Apache Hive 目录只能被 Apache Hive 或这个库访问,而 Apache Spark 目录只能被 Apache Spark 中现有的 API 访问。换句话说,一些特性,如 ACID 表或带有 Apache Hive 表的 Apache Ranger 只能通过 Apache Spark 中的这个库获得。 Hive 中的这些表不应该在 Apache Spark API 本身中直接访问。
下面的文章解释了步骤:Integrating Apache Hive with Apache Spark - Hive Warehouse Connector
【讨论】:
【参考方案2】:我在设置以下属性后遇到了同样的问题,它工作正常。
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;
【讨论】:
您使用的是哪个 hadoop 发行版? spark和hive的版本是什么? 我正在使用 HDP3、Hive-3.1.0 和 Spark-3.1.0 我想你的意思是 Spark2.3.1,对吧?从 HDP3.0 开始,我们从 Spark 访问 Hive 表的方式已更改 community.hortonworks.com/content/kbentry/223626/… ,您是否使用这些步骤访问 Hive 表?以上是关于通过 Spark 加载的表在 Hive 中无法访问的主要内容,如果未能解决你的问题,请参考以下文章
无法通过 Unix Shell 终端中的 Spark 查看在配置单元中创建的表