Я начал работать с 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: Предложите мне, есть ли альтернативный подход для достижения этого варианта использования.
На самом деле я сделал первый, не используя пользовательский процессор. Я использовал MergeContent для выполнения пакетной обработки. Теперь он работает так, как я хочу. Однако меня заинтриговала вторая идея. Я попробую это. У меня есть один вопрос. Поскольку у нас есть только один AVRO-файл в HDFS, и мы передадим этот путь HDFS в команде LOAD, прочитав значения разделов и когда мы запустим команду LOAD DATA, как записи будут перемещены в Hive по всем разделам? Можно ли перемещать файлы AVRO? Я имею в виду, что единственный AVRO получает разделение на несколько AVRO и помещается в соответствующие разделы? –
Оказывается, второй способ не будет работать, потому что все разделы будут иметь те же данные. Если вы использовали RouteOnAttribute, то MergeContent перед PutHDFS, это похоже на правильный путь. – mattyb
Да. Второй будет помещать все в один раздел. Кстати, я не использую RouteOnAtrribute. MergeContent с свойством атрибута Correlation Attribute выполнил эту работу. В любом случае спасибо. –