我想运行多个 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?
最佳答案
您可以在 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-linux和 https://thoughtsimproved.wordpress.com/2015/05/18/parellel-processing-in-bash/
关于database - 如何使用 shell 脚本将 HiveQL 查询的结果输出到 CSV?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53755508/