Невозможно настроить свойства ORC в Spark

Я использую 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 на выходе подтверждает, что конфигурации не применены. Фрагмент Orcfiledump ниже.

Compression: ZLIB
Compression size: 262144

person Vijay Kumar Reddy Chinnam    schedule 20.01.2017    source источник


Ответы (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 использует собственные библиотеки SerDe для ORC (а также Parquet, JSON, CSV и т. д.), поэтому ему не нужно соблюдать стандартные свойства Hadoop/Hive.

Существуют некоторые специфичные для Spark свойства для Parquet, и они хорошо задокументированы. . Но опять же, эти свойства должны быть установлены перед созданием (или повторным созданием) файла hiveContext.

Для ORC и других форматов вам придется прибегнуть к параметрам DataFrameWriter, специфичным для формата; цитируя последний JavaDoc< /а>...

Для записи файлов ORC можно установить следующие специфичные для ORC параметры:
compression (по умолчанию snappy): кодек сжатия для использования при сохранении в файл. Это может быть одно из известных сокращенных имен без учета регистра (none, snappy, zlib и lzo). Это переопределит orc.compress

Обратите внимание, что кодек сжатия по умолчанию изменился в Spark 2; до этого было zlib

Таким образом, единственное, что вы можете установить, это кодек сжатия, используя

dataframe.write().format("orc").option("compression","snappy").save("wtf")
person Samson Scharfrichter    schedule 20.01.2017
comment
Я пробовал код ниже. Он не изменил сжатие с zlib на snappy. SparkConf sc = новый SparkConf(); sc.set(orc.compress,быстро); 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, схема); df.write().format(orc).option(сжатие,мгновенно).save(spark_orc_output); - person Vijay Kumar Reddy Chinnam; 23.01.2017
comment
я попытался настроить hive-site.xml. Это не работает. - person Vijay Kumar Reddy Chinnam; 23.01.2017
comment
Так что ваш последний вариант самый простой: ***.option("compression","snappy").*** - person Samson Scharfrichter; 23.01.2017