代码之家  ›  专栏  ›  技术社区  ›  kmh

从spark保存压缩的json

  •  3
  • kmh  · 技术社区  · 8 年前

    GzipCodec 但是有些事情让我很紧张。

    org.apache.spark.rdd.RDD.saveAsTextFile 在这里:

    https://spark.apache.org/docs/2.3.0/api/scala/index.html#org.apache.spark.rdd.RDD

    def saveAsTextFile(path: String, codec: Class[_ <: CompressionCodec]): Unit
    

    但是当我在这里查看可用的压缩编解码器时:

    https://spark.apache.org/docs/2.3.0/api/scala/index.html#org.apache.spark.io.CompressionCodec

    亲本特征 CompressionCodec

    编解码器的有线协议不能保证在Spark的各个版本之间兼容。这是打算作为一个内部压缩实用程序内的单火花应用

    那不好。。。但这很好,因为gzip可能更容易跨生态系统处理。

    压缩编解码器 ... 但是我尝试了以下方法将其另存为.gz,尽管hadoop的gzip代码不是 <: CompressionCodec .

    import org.apache.hadoop.io.compress.GzipCodec
    rdd.saveAsTextFile(bucketName, classOf[GzipCodec])
    

    我的问题:

    • 这是可行的,但是有什么理由不这样做。。。还是有更好的办法?
    1 回复  |  直到 8 年前
        1
  •  4
  •   Roberto Congiu    8 年前

    首先,您是绑定到rdd还是可以使用数据集/数据帧?

    对于数据帧,您可以使用

     df.write.format("json").
        option("compression", "org.apache.hadoop.io.compress.GzipCodec").
        save("...")
    

    然而,有一些考虑。压缩是很好的,但是如果文件 如果您希望以后处理该文件,则必须由一个工作进程读取该文件。 例如,如果您的文件是不可拆分的,并且是1G,则处理它需要T时间,如果它是可拆分的(如LZO、Snappy或BZip2),则可以在T/N中处理,其中N是拆分的数目(假设128MB块,则大约为8)。 这就是为什么Hadoop使用SequenceFiles(SequenceFiles是可拆分的,并且在一个块中使用gzip),这也是为什么存储到S3时选择的压缩格式通常是Parquet。拼花文件比gzip文件小,并且是可拆分的,也就是说,它的内容可以由多个工人处理。

    归根结底,这实际上取决于您打算如何处理S3中的数据。

    会被询问吗?在这种情况下,拼花地板是一个更好的选择作为格式。

    它是否会被读取/复制到其他不懂拼花地板的系统?那么gzip压缩就可以了。而且它很稳定,你不必担心它的变化。