【问题标题】:how to solve spark read hive orc file meet error如何解决 spark read hive orc file meet 错误
【发布时间】:2021-05-22 01:35:14
【问题描述】:

jdk 1.8 斯卡拉 2.12.11 火花 3.0.1 当我读取 hive 表并在 scala spark 中写入导出 orc 文件时

df.write.option("compression", "none").mode(SaveMode.Overwrite).orc(dump_path)

运行成功

当我想从 python pyspark 中的周期导出 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)

【问题讨论】:

  • 在scala spark中像这样读取orc文件
  • def loadORCByOne(path:String):DataFrame={ val spark :SparkSession = SparkSession.builder().appName("sess").master("local[*]").getOrCreate() val df = spark.read.orc(path) df }
  • 在读取 parquet 文件时也遇到同样的错误

标签: scala apache-spark hive orc


【解决方案1】:

我遇到了同样的问题。 正如堆栈跟踪表明在执行 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 中它起作用了。您可以检查驱动程序/执行程序类路径中的 jars,从中获取“org.apache.orc.Reader”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-04
    • 2018-12-11
    • 2020-07-06
    • 1970-01-01
    • 2021-03-04
    • 2014-04-30
    • 2017-07-10
    • 2019-07-01
    相关资源
    最近更新 更多