-
问题描述:
Bugs SPARK-25947是Spark的一种文件格式Parquet的一些异常。在读取一个Parquet文件的时候,会抛出读取数据的数组越界异常。这会导致JVM崩溃。
-
代码示例:
读取文件时,会抛出以下异常:
java.lang.ArrayIndexOutOfBoundsException: 1068203124
at org.apache.spark.sql.execution.vectorized.OnHeapColumnVector.getInt(OnHeapColumnVector.java:863)
at org.apache.spark.sql.execution.datasources.parquet.ColumnChunkPageReader.readPages(ColumnChunkPageReader.java:106)
at org.apache.spark.sql.execution.datasources.parquet.ColumnChunkPageReader.initialize(ColumnChunkPageReader.java:86)
...
这个问题是由于在Parquet文件中有一个Metadata的大小大到足以使读取的数据数组溢出。这个问题已经在Spark 3.0.1中得到了修复。由于修复是在Spark 3.0.1中进行的,因此可以通过升级这个版本来解决这个问题。
升级到Spark 3.0.1的方法如下:
(1)更新Spark库的版本:
在pom.xml或build.sbt中,将Spark版本更新为3.0.1。
(2)重新构建应用程序:
在终端或命令行中,执行“sbt clean package”。
(3)重新进行测试:
使用Spark 3.0.1重新运行Parquet文件,确保问题已经被解决了。
如果您无法升级到Spark 3.0.1,请尝试将Parquet文件转换成其他格式(如CSV),然后再进行读取。