如何使用Shell脚本将HiveQL查询的结果输出到CSV?

时间:2018-12-13 05:31:41

标签: database bash hadoop hive bigdata

我想运行多个Hive查询,最好是并行而不是顺序运行,并将每个查询的输出存储到一个csv文件中。例如,query1中的csv1输出,query2中的csv2输出,等等。我将在离开工作后运行这些查询,以期在运行期间进行输出分析。下一个工作日。我对使用bash shell脚本感兴趣,因为这样我就可以设置一个cron任务来在一天的特定时间运行它。

我知道如何将HiveQL查询的结果存储在CSV文件中,一次存储一个查询。我这样做的方式如下:

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

上述问题是我必须监视进程何时完成并手动启动下一个查询。我也知道如何依次运行多个查询,如下所示:

hive -f hivequeries.hql

有没有办法将这两种方法结合起来?有没有更聪明的方法可以实现我的目标?

首选代码答案,因为我不太了解bash以便从头开始编写。

这个问题是另一个问题的变体:How do I output the results of a HiveQL query to CSV?

2 个答案:

答案 0 :(得分:1)

您可以在Shell脚本中运行和监视并行作业:

#!/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并行)在shell中运行并行进程,并在其上运行大量资源。另请阅读https://www.slashroot.in/how-run-multiple-commands-parallel-linuxhttps://thoughtsimproved.wordpress.com/2015/05/18/parellel-processing-in-bash/

答案 1 :(得分:0)

使用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分钟阅读https://doi.org/10.5281/zenodo.1146014的第1 + 2章,以学习基础知识,并花费第7章,以了解有关如何并行运行更多作业的更多信息。