首页 > 解决方案 > Spark Sql 从 Hive orc 分区表中读取,给出数组越界异常

问题描述

我在 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

在此之后,我尝试使用下面给出的代码段转换为时间戳。但在那之后,我也让数组超出了界限异常。

df2 = df.select('dt',unix_timestamp('dt', "yyyy-MM-dd HH:mm:ss") .cast(TimestampType()).alias("timestamp"))

标签: pysparkapache-spark-sql

解决方案


如果不指定分区过滤器,可能会导致此问题。在我这边,当我指定过滤器之间的日期时,它会解决这个超出范围的异常。


推荐阅读