Преобразовать вывод консоли Hive в текст или CSV - PullRequest
1 голос
/ 01 марта 2020

Мне нужно выполнить подсчет таблицы Hive, вывести результат в текстовый файл и перетащить его в другое место в качестве триггера.

Вывод куста в настоящее время выглядит следующим образом:

+-------------+----------+
|     _c0     |   _c1    |
+-------------+----------+
| 2020-03-01  | 3203500  |
+-------------+----------+

Я пробовал варианты, подобные следующим:

hive -e 'select CURRENT_DATE, count(*) from db.table;' | sed 's/[[:space:]]\+/,/g' > /trigger/trigger_file.txt

Но это не дает ожидаемый результат. Что еще я могу попробовать?

Ожидаемый результат в файле .txt следующий:

2020-03-01,3203500

Ответы [ 3 ]

1 голос
/ 02 марта 2020

Hive предоставляет встроенную команду для записи в файлы

INSERT OVERWRITE LOCAL DIRECTORY '/home/docs/temp' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' select * from db.table;

Другой способ

hive -S -e 'set hive.cli.print.header=false; select * from db.table' | sed 's/[[:space:]]\+/,/g' > /home/docs/temp.csv
1 голос
/ 03 марта 2020

Вы можете заменить вашу команду sed на

awk -F'[| ]+' '$2 ~ /[0-9]{4}-[0-9]{2}-[0-9]{2}/{print $2","$3}'

-F'[| ]+' устанавливает разделитель поля на регулярное выражение [| ]+, которое соответствует одному или нескольким вхождениям пробела или символа канала, затем захватывает все записи где второе поле соответствует шаблону типа даты ([0-9]{4}-[0-9]{2}-[0-9]{2}, см. demo ) и печатает значения второго и третьего столбцов через запятую и пробел между ними.

1 голос
/ 02 марта 2020

Чтобы избежать замены всех результатов с помощью sed ..et c, попробуйте использовать этот подход, используя concat_ws(',',col1,col2...etc), и для вывода результатов будет , разделенных данных!

hive -e 'select CONCAT_WS(',',CURRENT_DATE, count(*)) from Mytable' > /home/user/Mycsv.csv
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...