读取配置单元表时火花引发错误

时间:2020-02-06 16:47:16

标签: apache-spark hive apache-spark-sql bigdata

我正在尝试从蜂巢中的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')  

2 个答案:

答案 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' 
)
相关问题