2015-01-12 2 views
3

У меня есть файл паркета, который я сделал путем преобразования некоторого файла данных avro. Файл содержит сложные записи. Кроме того, у меня есть схема Avro этих записей, а также эквивалентная схема паркета (я получил ее, когда я преобразовал файл). Я хочу сделать таблицу улья, подкрепленную паркетным файлом.Как указать схему для данных паркета в улье 0.13+

Поскольку моя схема записи имеет много полей, очень сложно и склонна к ошибкам объявлять столбцы улья, соответствующие этим полям вручную. Вот почему я хочу, чтобы hive определял столбцы таблицы, поддерживаемые моим файлом паркета, используя паркетную схему записей, во многом аналогично AvroSerDe использует схему avro для определения столбцов таблицы. Поддерживается ли это ParquetSerDe? Как я могу это сделать?

P.S. Я знаю о возможном обходном пути, где я мог бы сначала определить таблицу с поддержкой avro, используя схему avro, а затем использовать оператор CTAS для создания таблицы паркета. Но это не работает, если схема имеет профсоюзы, поскольку AvroSerDe использует союзы Hive, у которых практически нет поддержки (!!), и ParquetSerDe не знает, как с ними справиться.

ответ

2

Я сделал несколько исследований, и получил ответ, поэтому здесь для кого-то еще застрял:

В настоящее время ParquetSerDe не поддерживает ни одного вида определения таблицы, кроме чистого DDL, где вы должны явно указать каждый столбец. Существует билет JIRA, который отслеживает добавление поддержки для определения таблицы с использованием существующего файла паркета (HIVE-8950).

0

К сожалению, нет паркета.schema.literal, доступного как avro.schema.literal, который может использоваться для определения таблицы с использованием схемы.

Вам нужно будет создать отдельные столбцы в определении таблицы или использовать операторы CTAS.

Насколько схема соединения не работает в улье. Я использую накидное определение схемы в моих файлах AVSC для поля типа данных и он работает довольно

Это структура моего AVSC:

{"namespace": "somename", 
"type": "record", 
"name": "somename", 
"fields": [ 
    {"name": "col1", "type": "string"}, 
    {"name": "col2", "type": "string"}, 
    {"name": "col3", "type": ["string","null"]}, 
    {"name": "col4", "type": ["string", "null"]}, 
    {"name": "col5", "type": ["string", "null"]}, 
    {"name": "col6", "type": ["string", "null"]}, 
    {"name": "col7", "type": ["string", "null"]}, 
    {"name": "col8", "type": ["string", "null"]} 
] 
} 
+0

Были ли у вас доступ к данным из полей объединения в улье? – miljanm

+0

Ваша схема имеет нулевые объединения только с одним вариантом реального типа. Это работает как с паркетным, так и с улей. Я говорил о союзах, где у вас есть несколько возможных типов данных, таких как '[" int "," string "," boolean "]'.AvroSerDe превращает их в тип улья, и я смог манипулировать данными такого рода только с помощью пользовательских UDF, так как улья не имеют никакой поддержки для них, даже в версии 0.14. ParquetSerDe выдает исключение, когда он встречает такой столбец. – miljanm

1

Мы используем Hive как часть пакета CDH, который также включает Impala.

В отличии от улья, Impala уже имеет поддержку вывода схемы из Паркетных файлов: http://www.cloudera.com/documentation/archive/impala/2-x/2-0-x/topics/impala_create_table.html

Примечания определения

Колонка выведенного из файла данных:

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.] Имя_таблицы LIKE PARQUET 'hdfs_path_of_parquet_file'

В настоящее время это работает только для файлов Parquet, а не AVRO.

Из-за этого мы фактически должны использовать Impala на некоторых наших рабочих процессах (например, после импорта sqoop в паркетные файлы или после distcp'ing из внешнего кластера хаопов - весьма полезно!).