问题描述
jdk 1.8 斯卡拉 2.12.11 火花 3.0.1 当我在 scala spark 中读取 hive 表并写入导出 orc 文件时
df.write.option("compression","none").mode(SaveMode.Overwrite).orc(dump_path)
运行成功
当我想从 python pyspark 中的 period export orc 文件中读取 orc 文件时 运行成功
dfs = spark.read.orc("/Users/muller/Documents/gitcode/personEtl/kNowledge_source_100.orc")
但是当我想从 scala spark 中的周期 orc 文件中读取相同的 orc 文件时遇到此错误
java.lang.classCastException: org.apache.orc.impl.ReaderImpl 不能转换为 java.io.Closeable java.lang.classCastException: org.apache.orc.impl.ReaderImpl 无法转换为 java.io.Closeable
at org.apache.spark.util.Utils$.tryWithResource(Utils.scala:2538)
at org.apache.spark.sql.execution.datasources.orc.OrcUtils$.readSchema(OrcUtils.scala:65)
at org.apache.spark.sql.execution.datasources.orc.OrcUtils$.$anonfun$readSchema$4(OrcUtils.scala:88)
at scala.collection.Iterator$$anon$10.next(Iterator.scala:461)
at scala.collection.TraversableOnce.collectFirst(TraversableOnce.scala:172)
at scala.collection.TraversableOnce.collectFirst$(TraversableOnce.scala:159)
at scala.collection.AbstractIterator.collectFirst(Iterator.scala:1431)
at org.apache.spark.sql.execution.datasources.orc.OrcUtils$.readSchema(OrcUtils.scala:88)
at org.apache.spark.sql.execution.datasources.orc.OrcUtils$.inferSchema(OrcUtils.scala:128)
at org.apache.spark.sql.execution.datasources.orc.OrcFileFormat.inferSchema(OrcFileFormat.scala:96)
at org.apache.spark.sql.execution.datasources.DataSource.$anonfun$getorInferFileFormatSchema$11(DataSource.scala:198)
at scala.Option.orElse(Option.scala:447)
at org.apache.spark.sql.execution.datasources.DataSource.getorInferFileFormatSchema(DataSource.scala:195)
at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:408)
解决方法
我遇到了同样的问题。 由于堆栈跟踪表明在执行 Utils.tryWithResource() 方法时发生故障。如果您看到源代码 https://github.com/apache/spark/blob/v3.0.1/core/src/main/scala/org/apache/spark/util/Utils.scala,可以看到它需要一个“java.io.Closable”对象。
“org.apache.orc.impl.ReaderImpl”被封装在实现“org.apache.orc.Reader”接口的hive-exec-**.jar中。 hive-exec 是一个胖 jar,它具有与 jar 及其包“org.apache.orc.Reader”打包在一起的所有依赖项,它没有扩展“java.io.Closable”类,这就是失败的原因。
请将 https://repo1.maven.org/maven2/org/apache/orc/orc-core/1.5.10/orc-core-1.5.10.jar 添加到您的 Spark 驱动程序/执行程序类路径中,此 jar 在“org.apache.orc.Reader”界面中扩展了 Closable。 jar 应该添加到类路径的开头,以便“orc-core”jar 中的“org.apache.orc.Reader”应该首先加载,而不是从“hive-exec”jar 中加载。
这样我就解决了这个问题。我不确定为什么在 pyspark 中它有效。您可以从“org.apache.orc.Reader”获取的位置检查驱动程序/执行程序类路径中的罐子。