Databricks PySpark指定Schema读取ORC文件报ArrayIndexOutOfBoundsException
列名不匹配是否会触发该异常
不会。你提到的列名拼写不一致的问题,只会导致自定义Schema中和ORC文件列名不匹配的字段读取结果全为null,不会触发下标为1024的ArrayIndexOutOfBoundsException异常。
异常根因分析
从你提供的异常堆栈可以明确根因:
Caused by: java.lang.ArrayIndexOutOfBoundsException: 1024
at org.apache.orc.impl.TreeReaderFactory$TreeReader.nextVector(TreeReaderFactory.java:292)
at org.apache.orc.impl.TreeReaderFactory$DecimalTreeReader.nextVector(TreeReaderFactory.java:1322)
at org.apache.orc.impl.ConvertTreeReaderFactory$DoubleFromDecimalTreeReader.nextVector(ConvertTreeReaderFactory.java:758)
这是ORC文件实际存储的字段类型和你自定义Schema中声明的字段类型不匹配导致的:ORC文件中某字段是Decimal类型,而你自定义Schema中把该字段声明为Double类型,类型转换过程中触发了ORC底层读取逻辑的数组越界错误。
排查解决步骤
- 先不带自定义Schema读取ORC文件,打印文件原生Schema:
data_df = spark.read.format("orc").load(folder_path_of_orc_file) data_df.printSchema()
- 将原生Schema和你自定义的Schema逐字段比对,修正类型不匹配的字段定义,同时也可以顺便修正列名拼写不一致的问题。
- 确认你自定义Schema中额外添加的分区字段
lastupdateddate的类型和实际分区字段类型一致。
补充说明
printSchema()本身是不需要触发分布式作业计算的本地操作,正常不会抛出异常。如果出现报错大概率是你的Schema构造过程存在语法错误,或者Databricks notebook环境的变量作用域问题,可以先检查user_schemas变量的定义是否正确、有没有拼写错误。
内容的提问来源于stack exchange,提问作者Tim

