【问题标题】:How do I output the results of a HiveQL query to CSV using a shell script?如何使用 shell 脚本将 HiveQL 查询的结果输出到 CSV?
【发布时间】:2019-05-14 07:04:59
【问题描述】:

我想运行多个 Hive 查询,最好是并行而不是顺序运行,并将每个查询的输出存储到一个 csv 文件中。例如,csv1 中的query1 输出,csv2 中的query2 输出等。我将在下班后运行这些查询,目标是在下一个工作日内分析输出。我对使用 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?

【问题讨论】:

标签: database bash hadoop hive bigdata


【解决方案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/

【讨论】:

  • 嗨@leftjoin 这看起来很有希望,我会测试它。通常,我会有 1 个screen 会话,有 3 个窗口,每个窗口运行一个 HiveQL 查询。每个窗口中的查询以不同的速率完成。因此,基本上有 3 种不同的管道。运行上述脚本时,它将处理第一组 3 个查询。如果我想运行第二组查询,脚本会是什么样子?是否只有在完成所有第一组查询后才开始第二组中的第一个查询?
  • 没关系,看起来你的第一个参考回答了这些问题。谢谢。
【解决方案2】:

使用 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 分钟了解有关如何并行运行更多作业的更多信息。

【讨论】:

    猜你喜欢
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多