【问题标题】:Unable to configure ORC properties in Spark无法在 Spark 中配置 ORC 属性
【发布时间】:2017-06-05 00:52:40
【问题描述】:

我正在使用 Spark 1.6 (Cloudera 5.8.2) 并尝试了以下方法来配置 ORC 属性。但不影响输出。

下面是我试过的代码sn-p。

 DataFrame dataframe =
                hiveContext.createDataFrame(rowData, schema);
dataframe.write().format("orc").options(new HashMap(){
            {

                put("orc.compress","SNAPPY");
                put("hive.exec.orc.default.compress","SNAPPY");

                put("orc.compress.size","524288");
                put("hive.exec.orc.default.buffer.size","524288");


                put("hive.exec.orc.compression.strategy", "COMPRESSION");

            }
        }).save("spark_orc_output");

除此之外,我还尝试了在 hive-site.xml 和 hiveContext 对象中设置的这些属性。

输出中的 hive --orcfiledump 确认未应用配置。 Orcfiledump sn ​​-p 如下。

Compression: ZLIB
Compression size: 262144

【问题讨论】:

    标签: java hadoop apache-spark hive cloudera


    【解决方案1】:

    您在这里犯了两个不同的错误。我不怪你;我去过那里...

    问题 #1
    orc.compress 其余不是 Spark DataFrameWriter 选项。它们是 Hive 配置属性,必须在创建hiveContext 对象之前定义...

    • hive-site.xml 在启动时可供 Spark 使用
    • 或在您的代码中,通过重新创建SparkContext...

     sc.getConf.get("orc.compress","<undefined>") // depends on Hadoop conf
    sc.stop
    val scAlt = new org.apache.spark.SparkContext((new org.apache.spark.SparkConf).set("orc.compress","snappy"))
    scAlt.getConf.get("orc.compress","<undefined>") // will now be Snappy
    val hiveContextAlt = new org.apache.spark.sql.SQLContext(scAlt)

    [编辑] 使用 Spark 2.x 脚本将变为...
    spark.sparkContext.getConf.get("orc.compress","<undefined>") // depends on Hadoop conf
    spark.close
    val sparkAlt = org.apache.spark.sql.SparkSession.builder().config("orc.compress","snappy").getOrCreate()
    sparkAlt.sparkContext.getConf.get("orc.compress","<undefined>") // will now be Snappy

    问题 #2
    Spark 使用自己的用于 ORC(以及 Parquet、JSON、CSV 等)的 SerDe 库,因此它不必遵循标准的 Hadoop/Hive 属性。

    Parquet 有一些 Spark 特有的属性,它们是well documented。但同样,这些属性必须在创建(或重新创建)hiveContext之前设置。

    对于 ORC 和其他格式,您必须使用特定格式的 DataFrameWriter 选项;引用最新的JavaDoc...

    您可以设置以下特定于 ORC 的选项来编写 ORC 文件:
    compression(默认snappy):压缩编解码器在何时使用 保存到文件。这可以是已知的不区分大小写的缩短之一 名称(nonesnappyzliblzo)。这将覆盖orc.compress

    请注意,默认压缩编解码器已随 Spark 2 更改;之前是zlib

    所以你唯一可以设置的是压缩编解码器,使用

    dataframe.write().format("orc").option("compression","snappy").save("wtf")
    

    【讨论】:

    • 我试过下面的代码。它没有将压缩从 zlib 更改为 snappy。 SparkConf sc = new SparkConf(); sc.set("orc.compress","snappy"); sc.set("orc.compress.size", "524288"); sc.setAppName("test_orc_config"); JavaSparkContext jsc = 新的 JavaSparkContext(sc); ..... HiveContext hiveContext = new org.apache.spark.sql.hive.HiveContext(jsc.sc()); DataFrame df =hiveContext.createDataFrame(rowData, schema); df.write().format("orc").option("compression","snappy").save("spark_orc_output");
    • 我尝试配置 hive-site.xml 。它没有用。
    • 所以你的最后一个选项是最简单的一个:***.option("compression","snappy").***
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 2020-04-26
    • 2017-01-21
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多