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;
无法从 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;