Spark Sql 从 Hive orc 分区表中读取,给出数组越界异常
Posted
技术标签:
【中文标题】Spark Sql 从 Hive orc 分区表中读取,给出数组越界异常【英文标题】:Spark Sql to read from Hive orc partitioned table giving array out of bound exception 【发布时间】:2019-02-27 14:36:44 【问题描述】:我在 Hive 中创建了一个带有分区的 ORC 表。使用 Apache pig 以 ORC 格式将数据加载到 HDFS 中。然后在此之上创建 Hive 表。分区列是年、月和日。当我尝试使用 spark sql 读取该表时,我得到了数组超出范围的异常。请在下面找到代码和错误消息。
代码:
myTable = spark.table("testDB.employee")
myTable.count()
错误:
错误执行程序:阶段 10.0 (TID 66) 中任务 8.0 中的异常 java.lang.IndexOutOfBoundsException: toIndex = 47
此表中的数据类型为 String、timestamp 和 double。当我尝试使用带有 spark sql 查询的 select 语句选择所有列时,我得到了如下所示的类转换异常。
py4j.protocol.Py4JJavaError: 调用时出错 o536.showString。 :org.apache.spark.SparkException:作业中止由于 阶段失败:阶段 12.0 中的任务 0 失败 1 次,最近一次 失败:在 12.0 阶段丢失任务 0.0(TID 84,本地主机,执行程序 驱动程序):java.lang.ClassCastException:org.apache.hadoop.io.Text 无法转换为 org.apache.hadoop.hive.serde2.io.TimestampWritable
在此之后,我尝试使用下面给出的 sn-p 代码转换为时间戳。但在那之后,我也让数组超出了边界异常。
df2 = df.select('dt',unix_timestamp('dt', "yyyy-MM-dd HH:mm:ss") .cast(TimestampType()).alias("timestamp"))
【问题讨论】:
您使用的是什么版本的 spark?检查这个jira.apache.org/jira/browse/SPARK-24472 Spark 版本 - 2.1.1.2.6.1.0 和 python 2.6.6 旧的 spark 版本有同样的错误。我附上了票的链接。尝试升级到 spark 2.4 我可以读取其他表,该表也是 ORC 表,它只有 1 个分区。但是对于这张表,我只面临这个问题,它有很多基于天的分区。那么这个问题是否有可能是由于表中的分区造成的? 可能是的。当您说一个分区时,意味着实际上没有分区。有一个目录包含您的所有数据。多个分区会有很多目录。 【参考方案1】:如果不指定分区过滤器,可能会导致此问题。在我这边,当我指定过滤器之间的日期时,它会解决这个超出范围的异常。
【讨论】:
以上是关于Spark Sql 从 Hive orc 分区表中读取,给出数组越界异常的主要内容,如果未能解决你的问题,请参考以下文章