我正在尝试从蜂巢中的db.abc中选择*,此蜂巢表是使用spark加载的
它不起作用显示错误:
错误:java.io.IOException:java.lang.IllegalArgumentException: bucketId超出范围:-1(状态=,代码= 0)
使用以下属性时,我可以查询配置单元:
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;
现在,当我尝试使用spark读取同一配置单元表db.abc时,出现以下错误:
只有具有以下条件的客户才能访问此表 功能: CONNECTORREAD,HIVEFULLACIDREAD,HIVEFULLACIDWRITE,HIVEMANAGESTATS,HIVECACHEINVALIDATE,CONNECTORWRITE。 该表可以是Hive管理的ACID表,也可以要求其他一些表 Spark当前未实现的功能;在 org.apache.spark.sql.catalyst.catalog.CatalogUtils $ .throwIfNoAccess(ExternalCatalogUtils.scala:280) 在 org.apache.spark.sql.hive.HiveTranslationLayerCheck $$ anonfun $ apply $ 1.applyOrElse(HiveTranslationLayerStrategies.scala:105) 在 org.apache.spark.sql.hive.HiveTranslationLayerCheck $$ anonfun $ apply $ 1.applyOrElse(HiveTranslationLayerStrategies.scala:85) 在 org.apache.spark.sql.catalyst.trees.TreeNode $$ anonfun $ transformUp $ 1.apply(TreeNode.scala:289) 在 org.apache.spark.sql.catalyst.trees.TreeNode $$ anonfun $ transformUp $ 1.apply(TreeNode.scala:289) 在 org.apache.spark.sql.catalyst.trees.CurrentOrigin $ .withOrigin(TreeNode.scala:70) 在 org.apache.spark.sql.catalyst.trees.TreeNode.transformUp(TreeNode.scala:288) 在 org.apache.spark.sql.catalyst.trees.TreeNode $$ anonfun $ 3.apply(TreeNode.scala:286) 在 org.apache.spark.sql.catalyst.trees.TreeNode $$ anonfun $ 3.apply(TreeNode.scala:286) 在 org.apache.spark.sql.catalyst.trees.TreeNode $$ anonfun $ 4.apply(TreeNode.scala:306) 在 org.apache.spark.sql.catalyst.trees.TreeNode.mapProductIterator(TreeNode.scala:187) 在 org.apache.spark.sql.catalyst.trees.TreeNode.mapChildren(TreeNode.scala:304) 在 org.apache.spark.sql.catalyst.trees.TreeNode.transformUp(TreeNode.scala:286) 在 org.apache.spark.sql.catalyst.trees.TreeNode $$ anonfun $ 3.apply(TreeNode.scala:286) 在 org.apache.spark.sql.catalyst.trees.TreeNode $$ anonfun $ 3.apply(TreeNode.scala:286) 在 org.apache.spark.sql.catalyst.trees.TreeNode $$ anonfun $ 4.apply(TreeNode.scala:306) 在 org.apache.spark.sql.catalyst.trees.TreeNode.mapProductIterator(TreeNode.scala:187) 在 org.apache.spark.sql.catalyst.trees.TreeNode.mapChildren(TreeNode.scala:304) 在 org.apache.spark.sql.catalyst.trees.TreeNode.transformUp(TreeNode.scala:286) 在 org.apache.spark.sql.hive.HiveTranslationLayerCheck.apply(HiveTranslationLayerStrategies.scala:85) 在 org.apache.spark.sql.hive.HiveTranslationLayerCheck.apply(HiveTranslationLayerStrategies.scala:83) 在 org.apache.spark.sql.catalyst.rules.RuleExecutor $$ anonfun $ execute $ 1 $$ anonfun $ apply $ 1.apply(RuleExecutor.scala:87) 在 org.apache.spark.sql.catalyst.rules.RuleExecutor $$ anonfun $ execute $ 1 $$ anonfun $ apply $ 1.apply(RuleExecutor.scala:84) 在 scala.collection.LinearSeqOptimized $ class.foldLeft(LinearSeqOptimized.scala:124) 在scala.collection.immutable.List.foldLeft(List.scala:84)在 org.apache.spark.sql.catalyst.rules.RuleExecutor $$ anonfun $ execute $ 1.apply(RuleExecutor.scala:84) 在 org.apache.spark.sql.catalyst.rules.RuleExecutor $$ anonfun $ execute $ 1.apply(RuleExecutor.scala:76) 在scala.collection.immutable.List.foreach(List.scala:392)在 org.apache.spark.sql.catalyst.rules.RuleExecutor.execute(RuleExecutor.scala:76) 在 org.apache.spark.sql.catalyst.analysis.Analyzer.org $ apache $ spark $ sql $ catalyst $ analysis $ Analyzer $$ executeSameContext(Analyzer.scala:124) 在 org.apache.spark.sql.catalyst.analysis.Analyzer.execute(Analyzer.scala:118) 在 org.apache.spark.sql.catalyst.analysis.Analyzer.executeAndCheck(Analyzer.scala:103) 在 org.apache.spark.sql.execution.QueryExecution.analyzed $ lzycompute(QueryExecution.scala:57) 在 org.apache.spark.sql.execution.QueryExecution.analyzed(QueryExecution.scala:55) 在 org.apache.spark.sql.execution.QueryExecution.assertAnalyzed(QueryExecution.scala:47) 在org.apache.spark.sql.Dataset $ .ofRows(Dataset.scala:74)在 org.apache.spark.sql.SparkSession.sql(SparkSession.scala:642)... 49 消失
我是否需要在spark-submit或shell中添加任何属性?或者使用spark读取此hiv e表的另一种方法
蜂巢表样本格式:
CREATE TABLE `hive``( |
| `c_id` decimal(11,0),etc.........
ROW FORMAT SERDE |
| 'org.apache.hadoop.hive.ql.io.orc.OrcSerde' |
| WITH SERDEPROPERTIES (
STORED AS INPUTFORMAT |
| 'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' |
| OUTPUTFORMAT |
| 'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat' |
LOCATION |
| path= 'hdfs://gjuyada/bbts/scl/raw' |
| TBLPROPERTIES ( |
| 'bucketing_version'='2', |
| 'spark.sql.create.version'='2.3.2.3.1.0.0-78', |
| 'spark.sql.sources.provider'='orc', |
| 'spark.sql.sources.schema.numParts'='1', |
| 'spark.sql.sources.schema.part.0'='{"type":"struct","fields":
[{"name":"Czz_ID","type":"decimal(11,0)","nullable":true,"metadata":{}},
{"name":"DzzzC_CD","type":"string","nullable":true,"metadata":{}},
{"name":"C0000_S_N","type":"decimal(11,0)","nullable":true,"metadata":{}},
{"name":"P_ _NB","type":"decimal(11,0)","nullable":true,"metadata":{}},
{"name":"C_YYYY","type":"string","nullable":true,"metadata":{}},"type":"string","nullable":true,"metadata":{}},{"name":"Cv_ID","type":"string","nullable":true,"metadata":{}},
| 'transactional'='true', |
| 'transient_lastDdlTime'='1574817059')
答案 0 :(得分:3)
您试图将 Transactional table
(transactional = true)
读入Spark的问题。
Hive-ACID 表尚未正式支持
Spark
,请获取full dump/incremental dump of acid table
到常规的hive orc/parquet
分区表,然后使用spark读取数据。
有一个Open Jira saprk-15348,增加了对读取 Hive ACID
表的支持。
如果在酸性表(来自配置单元)上运行 major compaction
,则spark只能读取 base_XXX
目录,但不能读取增量在此jira中寻址的目录Spark-16996。
有一些解决方法,如本链接中所述,使用SPARK-LLAP读取酸表。
我认为从 HDP-3.X
开始HiveWareHouseConnector能够支持读取HiveAcid表。
您可以将事务表的snapshot
创建为 non transactional
,然后从表中读取数据。
create table <non_trans> stored as orc as select * from <transactional_table>
UPDATE:
1。创建一个外部配置单元表:
CREATE external TABLE `<ext_tab_name>`(
<col_name> <data_type>....etc
)
stored as orc
location '<path>';
2。然后使用现有的事务表数据覆盖上面的外部表。
insert overwrite table <ext_tab_name> select * from <transactional_tab_name>;
答案 1 :(得分:1)
您需要使用 TBLPROPERTIES ( 'transactional'='false' )
CREATE TABLE your_table(
`col` string,
`col2` string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
TBLPROPERTIES (
'transactional'='false'
)