pyspark - 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"))
解决方案
如果不指定分区过滤器,可能会导致此问题。在我这边,当我指定过滤器之间的日期时,它会解决这个超出范围的异常。
推荐阅读
- javascript - 无法将数组列表从 JavaScript 发送到 Django View
- java - 测试用例的样本通过但其他测试用例无法在java中通过任何人都可以帮助我理解测试用例
- python - 处理 DST 调整的时间数据
- oracle - oracle ROW_NUMBER()
- windows - 如何制作一个批处理程序,将我输入的内容输出到 .txt 文件中
- javascript - 如何仅从地图方法显示数据 5 项
- java - 如何使用 rest api 响应验证 ui 数据
- google-sheets - 根据使用谷歌表格公式设置的频率获取下一个日期
- spring - 在 Spring oauth2 客户端中处理令牌响应
- asp.net-web-api - dotnet core API 中的超时处理