在 Spark 2.3.0 中读取 Zstandard 压缩文件

Posted

技术标签:

【中文标题】在 Spark 2.3.0 中读取 Zstandard 压缩文件【英文标题】:Read Zstandard-compressed file in Spark 2.3.0 【发布时间】:2018-06-15 02:16:38 【问题描述】:

Apache Spark 据称从 Spark 2.3.0 (https://issues.apache.org/jira/browse/SPARK-19112) 开始支持 Facebook 的 Zstandard 压缩算法,但我实际上无法读取 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】:

根据this comment,Spark 2.3.0 中对 Zstandard 的支持仅限于内部和随机输出。

读取或写入 Zstandard 文件使用 Hadoop 的 org.apache.hadoop.io.compress.ZStandardCodec,它是在 Hadoop 2.9.0 中引入的(2.8.3 包含在 EMR 5.14.0 中)。

【讨论】:

我使用的是 Hadoop 3.2.2,但是在尝试读取 zstd 时,它给了我一个 java.lang.RuntimeException: native zStandard library not available: 这个版本的 libhadoop 是在没有 zstd 支持的情况下构建的.有任何想法吗?谢谢 我也是@cnstlungu,我正在运行hadoop 2.10 hadoop checknative -a,似乎zstd : false,可能zstd 许可证没有完全开放,apache 团队决定没有它就建? @DiegoScaravaggi 我是这样整理的***.com/questions/67099204/… @cnstlungu ,我认为你是对的,但我没有使用 3.x 数据平台,在我的 2.10 上,当我添加 native 库时我得到了@ 987654325@,暂时先推迟nativa库,我会安排一个3.x的测试平台,等待bigtop apache团队稳定构建1.6

以上是关于在 Spark 2.3.0 中读取 Zstandard 压缩文件的主要内容,如果未能解决你的问题,请参考以下文章

求问怎么设置sparksql读取hive的数据库

在数据集中拆分字符串 Apache Spark

如何在不使用 flatMapsGroupWithState 的情况下使用 Structured Streaming 2.3.0 在 spark 中进行无状态聚合?

我可以使用spark 2.3.0和pyspark从Kafka进行流处理吗?

我可以使用 spark 2.3.0 和 pyspark 从 Kafka 进行流处理吗?

在 Spark 中读取 XML