Как вывести результаты запроса HiveQL в CSV?
мы хотели бы поместить результаты запроса Hive в файл CSV. Я думал, что команда должна выглядеть так:
insert overwrite directory '/home/output.csv' select books from table;
когда я запускаю его, он говорит, что он успешно завершен, но я никогда не могу найти файл. Как найти этот файл или я должен извлекать данные по-другому?
спасибо!
10 ответов:
хотя можно использовать
INSERT OVERWRITE
чтобы получить данные из улья, это может быть не лучший метод для вашего конкретного случая. Сначала позвольте мне объяснить, чтоINSERT OVERWRITE
делает, то я опишу метод, который я использую, чтобы получить tsv файлы из таблиц Hive.по данным руководство ваш запрос будет хранить данные в каталоге в HDFS. Формат не будет csv.
данные, записанные в файловую систему, сериализуются в виде текста со столбцами, разделенными ^A и строки, разделенные новыми строками. Если какой-либо из столбцов не имеет примитивного типа, то эти столбцы сериализуются в формат JSON.
небольшая модификация (добавление
LOCAL
ключевое слово) будет хранить данные в локальный каталог.INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' select books from table;
когда я запускаю аналогичный запрос, вот как выглядит вывод.
[lvermeer@hadoop temp]$ ll total 4 -rwxr-xr-x 1 lvermeer users 811 Aug 9 09:21 000000_0 [lvermeer@hadoop temp]$ head 000000_0 "row1""col1"1234"col3"1234FALSE "row2""col1"5678"col3"5678TRUE
лично я обычно запускаю свой запрос непосредственно через Hive в командной строке для такого рода вещей и передаю его в локальный файл вот так:
hive -e 'select books from table' > /home/lvermeer/temp.tsv
это дает мне разделенный вкладками файл, который я могу использовать. Надеюсь, что это полезно и для вас.
на основе этот патч-3682, Я подозреваю, что лучшее решение доступно при использовании Hive 0.11, но я не могу проверить это сам. Новый синтаксис должен позволить следующее.
INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' select books from table;
надеюсь, что это поможет.
Если вы хотите файл CSV, то вы можете изменить решения Lukas следующим образом (предполагая, что вы находитесь на поле linux):
hive -e 'select books from table' | sed 's/[[:space:]]\+/,/g' > /home/lvermeer/temp.csv
вы должны использовать инструкцию CREATE TABLE AS SELECT (CTAS) для создания каталога в HDFS с файлами, содержащими результаты запроса. После этого вам придется экспортировать файлы из HDFS в ваш обычный диск и объединить их в один файл.
вам также, возможно, придется сделать некоторые хитрости, чтобы конвертировать файлы из '\001' - delimited в CSV. Вы можете использовать пользовательский CSV SerDe или постпроцессор извлеченного файла.
Если вы используете оттенок это довольно просто, а также. Просто перейдите в Редактор Hive в HUE, выполните запрос hive, затем сохраните файл результата локально как XLS или CSV, или вы можете сохранить файл результата в HDFS.
Я искал аналогичное решение, но те, которые упомянуты здесь, не будут работать. Мои данные имели все варианты пробелов (пробел, новая строка, вкладка) символов и запятых.
чтобы сделать данные столбца tsv безопасными, Я заменил все символы \t в данных столбца пробелом и выполнил код python в командной строке для создания файла csv, как показано ниже:
hive -e 'tab_replaced_hql_query' | python -c 'exec("import sys;import csv;reader = csv.reader(sys.stdin, dialect=csv.excel_tab);writer = csv.writer(sys.stdout, dialect=csv.excel)\nfor row in reader: writer.writerow(row)")'
это создало совершенно допустимый csv. Надеюсь, это поможет тем, кто ищет это решение.
вы можете использовать функцию hive string
CONCAT_WS( string delimiter, string str1, string str2...strn )
например:
hive -e 'select CONCAT_WS(',',cola,colb,colc...,coln) from Mytable' > /home/user/Mycsv.csv
можно использовать
INSERT
...DIRECTORY
..., как в этом примере:INSERT OVERWRITE LOCAL DIRECTORY '/tmp/ca_employees' SELECT name, salary, address FROM employees WHERE se.state = 'CA';
OVERWRITE
иLOCAL
имеют те же интерпретации, что и раньше, и пути интерпретируются в соответствии с обычными правилами. Один или несколько файлов будут записаны в/tmp/ca_employees
в зависимости от количества редукторов вызывается.
у меня была аналогичная проблема, и вот как я смог ее решить.
Шаг 1 - загружены данные из таблицы Hive в другую таблицу следующим образом
DROP TABLE IF EXISTS TestHiveTableCSV; CREATE TABLE TestHiveTableCSV ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' AS SELECT Column List FROM TestHiveTable;
Шаг 2 - скопировал большой двоичный объект из хранилища Hive в новое место с соответствующим расширением
Start-AzureStorageBlobCopy -DestContext $destContext -SrcContainer "Source Container" -SrcBlob "hive/warehouse/TestHiveTableCSV/000000_0" -DestContainer "Destination Container" -DestBlob "CSV/TestHiveTable.csv"