在Spark 2.3.0中读取Zstandard压缩文件

8

据说自 Spark 2.3.0 起,Apache Spark 支持 Facebook 的 Zstandard 压缩算法 (https://issues.apache.org/jira/browse/SPARK-19112),但我无法真正读取一个经过 Zstandard 压缩的文件:

$ spark-shell

...

// Short name throws an exception
scala> val events = spark.read.option("compression", "zstd").json("data.zst")
java.lang.IllegalArgumentException: Codec [zstd] is not available. Known codecs are bzip2, deflate, uncompressed, lz4, gzip, snappy, none.

// Codec class can be imported
scala> import org.apache.spark.io.ZStdCompressionCodec
import org.apache.spark.io.ZStdCompressionCodec

// Fully-qualified code class bypasses error, but results in corrupt records
scala> spark.read.option("compression", "org.apache.spark.io.ZStdCompressionCodec").json("data.zst")
res4: org.apache.spark.sql.DataFrame = [_corrupt_record: string]

我需要做什么才能读取这样的文件呢?

环境是 AWS EMR 5.14.0。

1个回答

5
根据此评论,Spark 2.3.0中对Zstandard的支持仅限于内部和Shuffle输出。
读取或写入Zstandard文件时会使用Hadoop的org.apache.hadoop.io.compress.ZStandardCodec,该编解码器在Hadoop 2.9.0中引入(EMR 5.14.0包含2.8.3版本)。

1
我正在使用Hadoop 3.2.2,但是当尝试读取zstd时,它会给出一个java.lang.RuntimeException错误:本地zStandard库不可用:此版本的libhadoop没有构建zstd支持。有什么想法吗?谢谢。 - cnstlungu
我也一样 @cnstlungu,我正在运行 hadoop 2.10 hadoop checknative -a,看起来 zstd : false,也许 zstd 许可证不完全开放,Apache 团队决定在没有它的情况下构建? - Diego Scaravaggi
1
@DiegoScaravaggi 这是我解决问题的方法 https://stackoverflow.com/questions/67099204/reading-a-zst-archive-in-scala-spark-native-zstandard-library-not-available - cnstlungu
@cnstlungu,我认为你是对的,但我没有使用3.x数据平台,在我的2.10上,当我添加了native库后,我得到了main org.apache.spark.sql.AnalysisException: java.lang.Uns atisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$POSIX.stat,现在我将推迟nativa库,我将安排一个带有3.x的测试平台,并等待bigtop apache团队发布稳定版本1.6。 - Diego Scaravaggi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接