当前位置: 首页 > 知识库问答 >
问题:

读取hive事件表时Spark抛出错误

宗政坚白
2023-03-14

我正在尝试从db中选择*。abc在蜂箱中,这个蜂箱表是使用spark加载的

它不工作显示错误:

错误:java。伊奥。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;

现在,当我尝试读取相同的hive表db.abc使用火花,我收到的错误如下:

客户端只有在具有以下功能时才能访问此表:CONNECTORREAD、HIVEFULLACIDREAD、HIVEFULLACIDWRITE、HIVEMANAGESTATS、HIVECACHINVALIDATE、CONNECTORWRITE。此表可能是Hive管理的ACID表,或需要Spark当前未实现的某些其他功能;在org.apache.spark.sql.catalyst.catalog.CatalogUtils$. throwIfNoAccess(ExternalCatalogUtils.scala:280)在org.apache.spark.sql.hive.HiveTranslationLayerCheck$$anonfun$申请$1.applyOrse(HiveTranslationLayerStrategies.scala:105)在org.apache.spark.sql.hive.HiveTranslationLayerCheck$anonfun$申请$1.applyOrElse(HiveTranslationLayerStrategies.scala:85)在org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$transformUp$1.apply(TreeNode.scala:289)在TreeNode$$anonfun$transformUp$1.apply(TreeNode.scala:289)在org.apache.spark.sql.catalyst.trees.货币起源$. with Origin(TreeNode.scala:70TreeNode. transformUp(TreeNode. scala: 286)在org. apache. sql.催化剂. tree。TreeNode$anonfun3美元。应用(TreeNode. scala: 286)在org. apache. sql.催化剂. tree。TreeNode$anonfun3美元。在org. apache. sql.催化剂. tree应用(TreeNode. scala: 286)。树节点$anonfun4美元。应用(TreeNode. scala: 306)在org. apache. sql.催化剂. tree。TreeNode. mapProductIterator(TreeNode. scala: 187)在org. apache. sql.催化剂. tree。树节点。地图儿童(TreeNode. scala: 304)在org. apache. sql.催化剂. tree。树节点.变换RuleExecutor.执行(RuleExecutor. scala: 76)在org. apache. spak. sql催化剂分析。Analyzer. org$apache$火花$sql$催化剂$分析$Analyzer$执行SameContext(Analyzer. scala: 124)在org. apache. sql.催化剂分析。分析器执行(Analyzer. scala: 118)在org. apache. sql.催化剂分析。分析器执行和检查(Analyzer. scala: 103)在org. apache. spark. sql.执行。查询执行。在org. apache. sql执行分析了$lzycompute(查询执行. scala: 57)。在org. apache. sql执行查询执行分析(查询执行. scala: 55)

我是否需要添加任何属性在火花提交或shell?或者有什么替代方法来阅读这个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')  

共有3个答案

孙清野
2023-03-14

退房https://github.com/qubole/spark-acid-用于Apache Spark的Hive ACID数据源,它将允许您读取Hive ACID/事务表。

如果您使用的是Cloudera,请查看基于qubole项目的Hive Warehouse Connector(HWC):

  • HWC主页
  • 如果您可以以超级用户身份运行Spark应用程序并且不需要授权,请使用更快的Spark Direct Reader模式:博客文章
孟意致
2023-03-14

您需要使用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' 
)
慕俊迈
2023-03-14

您试图将事务表(Transactional=true)读入Spark的问题。

正式的Spark还不支持Hive ACID table,将ACID table的完全转储/增量转储获取到常规的Hive orc/parquet分区表,然后使用Spark读取数据。

有一个开放的Jira SPARK-15348,用于添加对读取蜂巢酸的支持。

>

如本链接所述,使用SPARK-LLAP阅读acid表格有一些变通方法。

我认为从HDP-3开始。XHiveWareHouse Connector能够支持读取HiveAcid表。

您可以将事务性表的快照创建为非事务性,然后从表中读取数据。

 **`create table <non_trans> stored as orc as select * from <transactional_table>`**

更新:

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>;
 类似资料:
  • 我试图在配置单元中执行select*from db.abc操作,此配置单元表是使用spark加载的 “它不工作”显示错误: 错误:java.io.IOException:java.lang.IllegalArgumentException:bucketId超出范围:-1(状态=,代码=0) 我需要在spark-submit或shell中添加任何属性吗?或者使用spark读取此hiv e表的另一种方

  • 我想通过配置单元jdbc连接将整个配置单元表加载到spark内存中。并且已经添加了配置单元站点。xml,hdfs站点。xml在我的项目中。spark已连接配置单元,因为已成功获取列名(例如role_id)。但是spark似乎将列名作为数据加载,并抛出异常。这是我的密码: 和获取错误: JAVAlang.NumberFormatException:对于输入字符串:“t_leave_map_base.

  • 我在apache Spark中读取本地文件时出错。scala>val f=sc.textfile(“/home/cloudera/downloads/sample.txt”)

  • 我试图在RDD中将PostgreSQL 9.6中的一个表读取到Spark 2.1.1中,我在Scala中有以下代码。 但是,它返回以下错误: 组织。阿帕奇。火花SparkException:作业因阶段失败而中止:阶段1.0中的任务0失败4次,最近的失败:阶段1.0中的任务0.3丢失(TID 7,10.0.0.13,执行者1):组织。postgresql。util。PSQLException:列索引

  • 我们可以使用以下命令轻松地从 Spark 中的 Hive 表中读取记录: 但是当我连接两个表时,例如: 如何从上面的连接查询中检索记录?

  • > 我运行spark shell,如下所示: spark-shell--jars.\spark-csv2.11-1.4.0.jar;.\commons-csv-1.2.jar(我不能直接下载这些依赖项,这就是我使用--jars的原因) 使用以下命令读取csv文件: 在执行第一个建议的解决方案后: