2017-02-07 21 views
1

Я начал работать с NiFi. Я использую прецедент для загрузки данных в Hive. Я получаю CSV-файл, а затем я использую SplitText, чтобы разбить входящий поток-файл на несколько потоков файлов (поделить запись по записи). Затем я использую ConvertToAvro для преобразования разделенного CSV-файла в AVRO-файл. После этого я поместил файлы AVRO в каталог в HDFS, и я запускаю команду «LOAD DATA», используя процессор ReplaceText + PutHiveQL.Каков наилучший способ загрузки данных в Hive с использованием NiFi?

Я разбиваю запись файла по записи, потому что для получения значения раздела (поскольку LOAD DATA не поддерживает динамическое разбиение). Поток выглядит следующим образом:

GetFile (CSV) --- SplitText (количество сплит линии: 1 и строка заголовка подсчитывать: 1) --- ExtractText (Использование регулярных выражений для получения значений полей Partition и присвоить атрибут) --- ConvertToAvro (Указание схемы) --- PutHDFS (Запись в месте HDFS) --- ReplaceText (LOAD DATA CMD с информацией раздела) --- PutHiveQL

T Дело в том, что, поскольку я разбиваю CSV-файл на каждую запись за раз, он генерирует слишком много файлов avro. Например, если CSV-файл имеет 100 записей, он создает 100 файлов AVRO. Поскольку я хочу получить значения раздела, я должен разбить их на одну запись за раз. Я хочу знать, есть ли какой-либо путь, мы можем достичь этой цели, не разбивая записи по записи. Я имею в виду, как его дозировать. Я совершенно новичок в этом, поэтому я пока не могу взломать это. Помогите мне с этим.

PS: Предложите мне, есть ли альтернативный подход для достижения этого варианта использования.

ответ

1

Вы хотите сгруппировать записи Avro на основе значений разделов, одного файла Avro за уникальное значение? Или вам нужны только значения разделов для некоторого количества команд LOAD DATA (и использовать один файл Avro со всеми записями)?

Если первый, то вам, скорее всего, понадобится пользовательский процессор или ExecuteScript, так как вам нужно будет анализировать, группировать/агрегировать и преобразовывать все за один шаг (т. Е. Для одного документа CSV). Если последнее, то вы можете изменить свой поток в:

GetFile ->ConvertCSVToAvro ->PutHDFS ->ConvertAvroToJSON ->SplitJson ->EvaluateJsonPath ->ReplaceText - >PutHiveQL

Этот поток помещает весь файл CSV (как один файл Avro) в HDFS, а затем он выполняет функцию spl он (после преобразования в JSON, так как у нас нет процессора EvaluateAvroPath), получает значение (ы) раздела и генерирует операторы Hive DDL (LOAD DATA).

+0

На самом деле я сделал первый, не используя пользовательский процессор. Я использовал MergeContent для выполнения пакетной обработки. Теперь он работает так, как я хочу. Однако меня заинтриговала вторая идея. Я попробую это. У меня есть один вопрос. Поскольку у нас есть только один AVRO-файл в HDFS, и мы передадим этот путь HDFS в команде LOAD, прочитав значения разделов и когда мы запустим команду LOAD DATA, как записи будут перемещены в Hive по всем разделам? Можно ли перемещать файлы AVRO? Я имею в виду, что единственный AVRO получает разделение на несколько AVRO и помещается в соответствующие разделы? –

+0

Оказывается, второй способ не будет работать, потому что все разделы будут иметь те же данные. Если вы использовали RouteOnAttribute, то MergeContent перед PutHDFS, это похоже на правильный путь. – mattyb

+0

Да. Второй будет помещать все в один раздел. Кстати, я не использую RouteOnAtrribute. MergeContent с свойством атрибута Correlation Attribute выполнил эту работу. В любом случае спасибо. –