Db8*_*Db8 3 hive bigdata apache-spark apache-spark-sql
我正在尝试从 hive 中的 db.abc 中选择 *,这个 hive 表是使用 spark 加载的
它不起作用显示错误:
错误:java.io.IOException:java.lang.IllegalArgumentException:bucketId 超出范围:-1 (state=,code=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:280) ) 在 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。
我需要在 spark-submit 或 shell 中添加任何属性吗?或者使用 spark 读取此 hive 表的替代方法是什么
hive 表示例格式:
  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')  
您试图读入 Spark 的问题。Transactional table(transactional = true)
官方
Spark还不支持Hive-ACID表,获取一个full dump/incremental dump of acid table普通的hive orc/parquet分区表,然后使用 spark 读取数据。
有一个 Open Jira saprk-15348来添加对阅读Hive ACID表的支持。
如果您major compaction在 Acid 表(来自 hive)上运行,那么 spark 只能读取base_XXX目录,但不能读取此 jira 中解决的delta 目录Spark-16996。
如本链接所述,有一些解决方法可以使用SPARK-LLAP读取酸表。
我认为从HiveWareHouseConnector开始能够支持读取 HiveAcid 表。HDP-3.X 
您可以创建一个snapshot事务表non transactional,然后从表中读取数据。
create table <non_trans> stored as orc as select * from <transactional_table>
UPDATE:
1.创建外部hive表:
 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>;