Как вывести результаты запроса HiveQL в CSV с помощью сценария оболочки? - PullRequest
0 голосов
/ 13 декабря 2018

Я хотел бы выполнить несколько запросов Hive, предпочтительно параллельно, а не последовательно, и сохранить результаты каждого запроса в файл CSV.Например, query1 вывод в csv1, query2 вывод в csv2 и т. Д. Я бы запустил эти запросы после окончания работы с целью анализа результатов в течение следующего рабочего дня.Я заинтересован в использовании сценария оболочки bash, потому что тогда я смогу настроить задачу cron для ее запуска в определенное время суток.

Я знаю, как сохранить результатыHiveQL-запрос в CSV-файле, один запрос за раз.Я делаю это примерно так:

hive -e 
"SELECT * FROM db.table;" 
" | tr "\t" "," > example.csv;

Проблема с вышесказанным заключается в том, что мне нужно следить за окончанием процесса и вручную запускать следующий запрос.Я также знаю, как последовательно выполнять несколько запросов, например так:

hive -f hivequeries.hql

Есть ли способ объединить эти два метода?Есть ли более разумный способ достижения моих целей?

Предпочтение отдается кодам, поскольку я недостаточно хорошо знаю bash, чтобы написать его с нуля.

Этот вопрос является вариантом другого вопроса: Как вывести результаты запроса HiveQL в CSV?

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

С GNU Parallel это выглядит так:

doit() {
  id="$1"
  hive -e "SELECT * FROM db.table$id;" | tr "\t" "," > example"$id".csv
}
export -f doit
parallel --bar doit ::: 1 2 3 4

Если ваши запросы не используют один и тот же шаблон, который вы можете сделать:

queries.txt:
SELECT * FROM db.table1;
SELECT id,name FROM db.person;
... other queries ...

cat queries.txt | parallel --bar 'hive -e {} | tr "\t" "," > example{#}.csv'

Потратьте 15 минут на чтение главы 1+2 из https://doi.org/10.5281/zenodo.1146014 для изучения основ и главы 7, чтобы узнать больше о том, как выполнять больше заданий параллельно.

0 голосов
/ 13 декабря 2018

Вы можете запускать и отслеживать параллельные задания в сценарии оболочки:

#!/bin/bash

#Run parallel processes and wait for their completion

#Add loop here or add more calls
hive -e "SELECT * FROM db.table1;" | tr "\t" "," > example1.csv &
hive -e "SELECT * FROM db.table2;" | tr "\t" "," > example2.csv &
hive -e "SELECT * FROM db.table3;" | tr "\t" "," > example3.csv &

#Note the ampersand in above commands says to create parallel process
#You can wrap hive call in a function an do some logging in it, etc
#And call a function as parallel process in the same way
#Modify this script to fit your needs

#Now wait for all processes to complete

#Failed processes count
FAILED=0

for job in `jobs -p`
do
   echo "job=$job"
   wait $job || let "FAILED+=1"
done   

#Final status check
if [ "$FAILED" != "0" ]; then
    echo "Execution FAILED!  ($FAILED)"
    #Do something here, log or send messege, etc
    exit 1
fi

#Normal exit
#Do something else here
exit 0

Существуют и другие способы (с использованием XARGS, GNU параллельно) для запуска параллельных процессов в оболочке и большого количества ресурсов в ней.Читайте также https://www.slashroot.in/how-run-multiple-commands-parallel-linux и https://thoughtsimproved.wordpress.com/2015/05/18/parellel-processing-in-bash/

...