Как вывести результаты запроса HiveQL в CSV?
мы хотели бы поместить результаты запроса Hive в файл CSV. Я думал, что команда должна выглядеть так:
insert overwrite directory '/home/output.csv' select books from table;
Когда я запустил его, он говорит, что он успешно завершен, но я никогда не могу найти файл. Как найти этот файл или я должен извлекать данные по-другому?
Спасибо!
Ответы
Ответ 1
Хотя для получения данных из Hive можно использовать INSERT OVERWRITE
, это может быть не лучший метод для вашего конкретного случая. Сначала позвольте мне объяснить, что делает INSERT OVERWRITE
, тогда я опишу метод, который я использую для получения tsv файлов из таблиц Hive.
В соответствии с руководство ваш запрос будет хранить данные в каталоге в HDFS. Формат не будет csv.
Данные, записанные в файловую систему, сериализуются как текст с столбцами, разделенными ^ A и строками, разделенными символами новой строки. Если какой-либо из столбцов не имеет примитивного типа, то эти столбцы сериализуются в формате JSON.
Небольшая модификация (добавление ключевого слова LOCAL
) будет хранить данные в локальном каталоге.
INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' select books from table;
Когда я запускаю аналогичный запрос, вот как выглядит вывод.
[[email protected] temp]$ ll
total 4
-rwxr-xr-x 1 lvermeer users 811 Aug 9 09:21 000000_0
[[email protected] 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;
Надеюсь, что это поможет.
Ответ 2
Если вам нужен CSV файл, вы можете изменить решения Lukas следующим образом (при условии, что вы находитесь в окне linux):
hive -e 'select books from table' | sed 's/[[:space:]]\+/,/g' > /home/lvermeer/temp.csv
Ответ 3
Вы должны использовать инструкцию CREATE TABLE AS SELECT (CTAS) для создания каталога в HDFS с файлами, содержащими результаты запроса. После этого вам придется экспортировать эти файлы с HDFS на обычный диск и объединить их в один файл.
Вам также, возможно, придется немного обмануть, чтобы преобразовать файлы из '\ 001' - разделили на CSV. Вы можете использовать пользовательский CSV SerDe или постпроцесс извлеченного файла.
Ответ 4
Если вы используете HUE, это довольно просто. Просто перейдите в редактор Hive в HUE, выполните свой запрос на улей, затем сохраните файл результатов локально как XLS или CSV, или вы можете сохранить файл результатов в HDFS.
Ответ 5
Вы можете использовать функцию строки hive CONCAT_WS( string delimiter, string str1, string str2...strn )
для ex:
hive -e 'select CONCAT_WS(',',cola,colb,colc...,coln) from Mytable' > /home/user/Mycsv.csv
Ответ 6
Я искал аналогичное решение, но упомянутые здесь не работали. У моих данных были все варианты пробелов (пробел, символ новой строки, табуляции) и запятые.
Чтобы сделать данные столбца tsv безопасными, я заменил все символы \t chars в данных столбца пробелом и выполнил код 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. Надеюсь, это поможет тем, кто ищет это решение.
Ответ 7
У меня была аналогичная проблема, и именно так я смог ее решить.
Шаг 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. Скопирован blob из хранилища Hive в новое место с соответствующим расширением
Start-AzureStorageBlobCopy
-DestContext $destContext
-SrcContainer "Source Container"
-SrcBlob "hive/warehouse/TestHiveTableCSV/000000_0"
-DestContainer "Destination Container"
-DestBlob "CSV/TestHiveTable.csv"
Ответ 8
Вы можете использовать INSERT
... DIRECTORY
..., как в этом примере:
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/ca_employees'
SELECT name, salary, address
FROM employees
WHERE se.state = 'CA';
OVERWRITE
и LOCAL
имеют те же интерпретации, что и раньше, и пути интерпретируются по обычным правилам. Один или несколько файлов будут записаны в /tmp/ca_employees
, в зависимости от количества вызываемых редукторов.
Ответ 9
Разделитель по умолчанию - "^A
". В языке python это "\x01
".
Когда я хочу изменить разделитель, я использую SQL как:
SELECT col1, delimiter, col2, delimiter, col3, ..., FROM table
Затем рассмотрите разделитель + "^A
" как новый разделитель.
Ответ 10
Как и в ответе Ray выше, Hive View 2.0 в Hortonworks Data Platform также позволяет выполнять запрос Hive, а затем сохранять выходные данные как csv.
Ответ 11
Если вы делаете это из Windows, вы можете использовать скрипт Python Hivehoney, чтобы извлечь данные таблицы в локальный файл CSV.
Будет:
- Вход в бастионный хост.
- pbrun.
- Kinit.
- Билайн (по вашему запросу).
- Сохранить эхо от билайна в файл на винде.
Выполните это так:
set PROXY_HOST=your_bastion_host
set SERVICE_USER=you_func_user
set LINUX_USER=your_SOID
set LINUX_PWD=your_pwd
python hh.py --query_file=query.sql
Ответ 12
Я пробовал разные варианты, но это было бы одним из самых простых решений для Python
Pandas
:
hive -e 'select books from table' | grep "|" ' > temp.csv
df=pd.read_csv("temp.csv",sep='|')
Вы также можете использовать tr "|" ","
tr "|" ","
конвертировать "|" к ","
Ответ 13
Просто для того, чтобы выполнить следующие шаги после запуска запроса: INSERT OVERWRITE LOCAL DIRECTORY '/home/lvermeer/temp' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' select books from table;
В моем случае сгенерированные данные в папке temp находятся в формате deflate
и выглядят так:
$ ls
000000_0.deflate
000001_0.deflate
000002_0.deflate
000003_0.deflate
000004_0.deflate
000005_0.deflate
000006_0.deflate
000007_0.deflate
Вот команда, чтобы разархивировать файлы deflate и поместить все в один CSV файл:
hadoop fs -text "file:///home/lvermeer/temp/*" > /home/lvermeer/result.csv
Ответ 14
hive --outputformat=csv2 -e "select * from yourtable" > my_file.csv
или же
hive --outputformat=csv2 -e "select * from yourtable" > [your_path]/file_name.csv
Для tsv просто измените csv на tsv в приведенных выше запросах и выполните ваши запросы
Ответ 15
Я могу опоздать на этот, но помог бы с ответом:
echo "COL_NAME1 | COL_NAME2 | COL_NAME3 | COL_NAME4"> SAMPLE_Data.csv hive -e 'выбрать отдельный concat (COL_1, "|", COL_2, "|", COL_3, "|", COL_4) из аргумента table_Name где, если требуется; ' >> SAMPLE_Data.csv
Ответ 16
Эта команда оболочки печатает выходной формат в csv в output.txt
без заголовков столбцов.
$ hive --outputformat=csv2 -f 'hivedatascript.hql' --hiveconf hive.cli.print.header=false > output.txt
Ответ 17
Это наиболее удобный для csv способ вывода результатов HiveQL.
Вам не нужны никакие команды grep или sed для форматирования данных, вместо этого hive поддерживает их, просто нужно добавить дополнительный тег outputformat.
hive --outputformat=csv2 -e 'select * from <table_name> limit 20' > /path/toStore/data/results.csv