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;
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试使用 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')
Run Code Online (Sandbox Code Playgroud)
您试图读入 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>';
Run Code Online (Sandbox Code Playgroud)
2.然后用现有的事务表数据覆盖到上面的外部表。
insert overwrite table <ext_tab_name> select * from <transactional_tab_name>;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3120 次 |
| 最近记录: |