代码之家  ›  专栏  ›  技术社区  ›  user2205916

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

  •  1
  • user2205916  · 技术社区  · 6 年前

    我希望运行多个配置单元查询,最好是并行运行,而不是顺序运行,并将每个查询的输出存储到csv文件中。例如 query1 csv1 , query2 输出 csv2 ,等等。我会在下班后运行这些查询,目的是在下一个工作日分析输出。我对使用bashshell脚本感兴趣,因为这样我就可以设置 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 回复  |  直到 6 年前
        1
  •  3
  •   leftjoin    6 年前

    您可以在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、gnupallel)来运行shell中的并行进程和大量资源。同时阅读 https://www.slashroot.in/how-run-multiple-commands-parallel-linux https://thoughtsimproved.wordpress.com/2015/05/18/parellel-processing-in-bash/

        2
  •  0
  •   Ole Tange    6 年前

    使用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'
    

    https://doi.org/10.5281/zenodo.1146014 学习基础知识,第7章学习如何并行运行更多作业。