Использование FileFormat v Serde для чтения пользовательских текстовых файлов - PullRequest
7 голосов
/ 12 октября 2011

Hadoop / Hive новичок здесь.Я пытаюсь использовать данные, хранящиеся в пользовательском текстовом формате с Hive.Насколько я понимаю, вы можете написать собственный FileFormat или собственный SerDe класс для этого.Это тот случай или я неправильно понимаю?И какие общие рекомендации о том, какой вариант выбрать, когда?Спасибо!

Ответы [ 4 ]

13 голосов
/ 03 ноября 2011

Я понял это.В конце концов, мне не нужно было писать serde, я написал собственный InputFormat (extends org.apache.hadoop.mapred.TextInputFormat), который возвращает собственный RecordReader (реализует org.apache.hadoop.mapred.RecordReader<K, V>).RecordReader реализует логику для чтения и анализа моих файлов и возвращает строки с разделителями табуляции.

После этого я объявил свою таблицу как

create table t2 ( 
field1 string, 
..
fieldNN float)        
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'    
STORED AS INPUTFORMAT 'namespace.CustomFileInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat';

При этом используется собственный SerDe.Также необходимо указать формат вывода при использовании пользовательского формата ввода, поэтому я выбираю один из встроенных форматов вывода.

7 голосов
/ 14 ноября 2015

В основном вам необходимо понимать разницу, когда нужно изменять SerDe, а когда - формат файла.

Из официальной документации: Hive SerDe

Что такое SerDe? 1.SerDe - это короткое название для «Сериализатора и Десериализатора». 2.Hive использует SerDe (и FileFormat) для чтения и записи строк таблицы. 3.HDFS файлы -> InputFileFormat -> -> Десериализатор -> Объект строки 4.Row объект -> Сериализатор -> -> OutputFileFormat -> HDFS файлы

Итак, 3-й и 4-й пункты явно выводят разницу. Вам нужно иметь пользовательский формат файла (ввод / вывод), когда вы хотите прочитать запись не так, как обычно (где записи разделены '\ n'). И вам нужно настроить SerDe, когда вы хотите интерпретировать прочитанные записи по-своему.

Давайте рассмотрим пример широко используемого формата JSON.

Сценарий 1: Допустим, у вас есть входной файл json, в котором одна строка содержит одну запись json. Итак, теперь вам просто нужен Custom Serde для интерпретации прочитанной записи так, как вы хотите. Нет необходимости настраивать входной формат, поскольку в 1 строке будет 1 запись.

Сценарий 2: Теперь, если у вас есть входной файл, где ваша одна запись JSON охватывает несколько строк, и вы хотите прочитать его как есть, то сначала вы должны написать собственный формат ввода для чтения в 1 записи json, а затем эта прочитанная запись json перейдет в Custom SerDe.

2 голосов
/ 04 июля 2013

Зависит от того, что вы получаете из вашего текстового файла.

Вы можете написать специальное устройство для чтения записей, которое будет анализировать файл текстового журнала и возвращать так, как вы хотите. Класс Input format делает эту работу за вас.Вы будете использовать этот jar для создания таблицы Hive и загрузки данных в эту таблицу.

Говоря о SerDe, я использую его немного по-другому.Я использую и InputFormat, и SerDe, первый для анализа фактических данных, а второй для стабилизации моих метаданных, представляющих реальные данные.Почему я это делаю?Я хочу создать соответствующие столбцы (не более или менее) в таблице кустов для каждой строки моего файла журнала, и я думаю, что SerDe является идеальным решением для меня.

В конечном итоге я сопоставляю эти две таблицы, чтобы создать итоговую таблицу, если я хочу или оставляю эти таблицы такими, какие они есть, чтобы я мог делать соединения для запроса из них.

Мне нравится объяснение блога Cloudera.

http://blog.cloudera.com/blog/2012/12/how-to-use-a-serde-in-apache-hive/

1 голос
/ 28 октября 2011

Если вы используете Hive, напишите serde. Смотрите эти примеры: https://github.com/apache/hive/tree/trunk/contrib/src/java/org/apache/hadoop/hive/contrib/serde2

Обратите внимание, что этот интерфейс специфичен для Hive. Если вы хотите использовать свой пользовательский формат файла для обычных заданий hadoop, вам придется реализовать отдельный интерфейс (я не совсем уверен, какой именно).

Если вы уже знаете, как десериализовать данные на другом языке, вы можете просто написать потоковое задание (используя любой язык) и использовать существующие библиотеки.

Надеюсь, что поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...