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

Sha*_*han 6 hadoop hive hortonworks-data-platform apache-spark pyspark

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

df.write.format("orc").mode("overwrite").saveAsTable("db.table")
Run Code Online (Sandbox Code Playgroud)

从Hive访问时出错:

错误:java.io.IOException:java.lang.IllegalArgumentException:bucketId超出范围:-1(状态=,代码= 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',
Run Code Online (Sandbox Code Playgroud)

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

df.write.mode("overwrite").saveAsTable("db.table")
Run Code Online (Sandbox Code Playgroud)

要么

df.createOrReplaceTempView("dfTable")
spark.sql("CREATE TABLE db.table AS SELECT * FROM dfTable")
Run Code Online (Sandbox Code Playgroud)

错误:

AnalysisException:u'org.apache.hadoop.hive.ql.metadata.HiveException:MetaException(由于以下原因,message:Table default.src未能通过严格的托管表检查:将该表标记为托管表,但不是事务性表。) ;'

堆栈版本详细信息:

火花2.3

Hive3.1

Hortonworks数据平台HDP3.0

Sha*_*han 3

从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 本身中直接访问。

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

将 Apache Hive 与 Apache Spark 集成 - Hive 仓库连接器