Spark SQL игнорирует свойство сжатия parquet.com, указанное в TBLPROPERTIES

Мне нужно создать таблицу Hive из Spark SQL, которая будет в формате PARQUET и сжатии SNAPPY. Следующий код создает таблицу в формате PARQUET, но со сжатием GZIP:

hiveContext.sql("create table NEW_TABLE stored as parquet tblproperties ('parquet.compression'='SNAPPY') as select * from OLD_TABLE")

Но в Hue «Таблицы хранилища метаданных» -> ТАБЛИЦА -> «Свойства» по-прежнему отображаются:

|  Parameter            |  Value   |
| ================================ |
|  parquet.compression  |  SNAPPY  |

Если я изменю SNAPPY на любую другую строку, например ABCDE код по-прежнему работает нормально, за исключением сжатия GZIP:

hiveContext.sql("create table NEW_TABLE stored as parquet tblproperties ('parquet.compression'='ABCDE') as select * from OLD_TABLE")

И оттенок «Таблицы хранилища метаданных» -> ТАБЛИЦА -> «Свойства» показывает:

|  Parameter            |  Value   |
| ================================ |
|  parquet.compression  |  ABCDE   |

Это заставляет меня думать, что TBLPROPERTIES просто игнорируется Spark SQL.

Примечание. Я попытался выполнить тот же запрос непосредственно из Hive, и в случае, если свойство было равно SNAPPY, таблица была успешно создана с надлежащим сжатием (т.е. SNAPPY, а не GZIP).

create table NEW_TABLE stored as parquet tblproperties ('parquet.compression'='ABCDE') as select * from OLD_TABLE

В случае, если свойство было ABCDE, запрос не завершился ошибкой, но таблица не была создана.

Вопрос в чем проблема?


person Andrey Dmitriev    schedule 29.04.2016    source источник


Ответы (2)


Прямо из документации Spark

При чтении и записи в таблицы Parquet хранилища метаданных Hive Spark SQL будет пытаться использовать свою собственную поддержку Parquet вместо Hive SerDe для повышения производительности.

Затем чуть ниже вы найдете некоторые свойства, которые контролируют, применяет ли Spark все параметры Hive (и производительность ...), то есть spark.sql.hive.convertMetastoreParquet, и как обрабатывать необработанное чтение / запись в файлах Parquet, таких как spark.sql.parquet.compression.codec (по умолчанию gzip - вы не удивляйтесь) или spark.sql.parquet.int96AsTimestamp.

В любом случае, свойства "сжатия по умолчанию" лишь ориентировочные. В пределах одной таблицы и каталога каждый файл Parquet может иметь свои собственные настройки сжатия - размер страницы, размер блока HDFS и т. Д.

person Samson Scharfrichter    schedule 29.04.2016
comment
А, и Spark явно не проверяет значения TblProperties, переданные в Metastore, но Metastore проверяет. Похоже, что есть исключение, которое не перехватывается должным образом, поэтому Metastore не создает определение таблицы ... но Spark все равно создает файлы в ожидаемом каталоге. - person Samson Scharfrichter; 30.04.2016

Это комбо, которое сработало для меня (Spark 2.1.0):

spark.sql("SET spark.sql.parquet.compression.codec=GZIP")
spark.sql("CREATE TABLE test_table USING PARQUET PARTITIONED BY (date) AS SELECT * FROM test_temp_table")

Проверено в HDFS:

/user/hive/warehouse/test_table/date=2017-05-14/part-00000-uid.gz.parquet
person Garren S    schedule 14.05.2017
comment
Для записи, для Parquet поддерживаются следующие кодеки сжатия: none, snappy, gzip и _4 _--, а для ORC вы должны ввести zlib вместо gzip spark.apache.org/docs/latest/api/java/index.html?org/apache/ < / а> - person Samson Scharfrichter; 22.03.2018