无法在Spark中配置ORC属性

时间:2017-01-20 05:35:20

标签: java hadoop apache-spark hive cloudera

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

以下是我尝试过的代码段。

 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 on output确认未应用配置。 Orcfiledump片段在下面。

Compression: ZLIB
Compression size: 262144

1 个答案:

答案 0 :(得分:6)

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

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

  • 在发布时可用于Spark的hive-site.xml
  • 或在您的代码中,通过重新创建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将自己的SerDe库用于ORC(以及Parquet,JSON,CSV等),因此它不必遵循标准的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")