zoukankan      html  css  js  c++  java
  • shell实操1-在shell脚本内连接hive做sql查询

    相关知识点

    shell的循环;shell连接hive-hive语句执行、hive文件执行;传参;输入输出文件,文件删除

    shell中list的循环:

    for line in ${list[@]}   #这里不能只写${list},执行结果不对,回头测试一下
    do
        执行语句
    done

    shell中的判断:

    result=$?
    if [$result !=0 ]; then
        执行语句
    fi

    cat配合重定向生成文件

    cat << EOF >/path/filename    # 也可以使用>>对文件进行追加
    your content
    EOF                              #顶格写

    EOF只是一个分界符,当然也可以用abcde替换。

    当shell遇到<<时,它知道下一个词是一个分界符。在该分界符以后的内容都被当作输入,直到shell又看到该分界符(位于单独的一行)。

    通过cat配合重定向能够生成文件并追加操作。

    代码

    代码一

    场景:有一批平行的数据库db1, db2, db3, ...,每个库都有tb_name这张表,现在要对每个库的这张表执行查询操作,通过shell后台连接hive数据库可以批量处理

    #!/bin/bash
    db_list=("db1" "db2" "db3" "db4" "db5" "db6")
    hive_url='jdbc:hive2://...;principal=hive/...'   #通过jdbc连接hive
    for db in ${db_list[@]}                                  
    do
        echo "${db}"
        beeline -u "${hive_url}"  --silent=false -hivevar db=$db -e "hivesql查询语句,eg: select * from ${db}.tb_name limit 1"
    done                                                   #这里silent静默模式若设置为True,会省略MR日志
    #判断上一条是否成功
    result=$?
    if [$result !=0 ]; then
        echo "---------------错误码:status:$result--------------------------"
    fi

    将hivesql放在文件中,用文件方式操作

    #这里文件通过循环追加文本存储的是参数还是参数值?           ——是参数值

    #!/bin/bash
    db_list=("db1" "db2" "db3" "db4" "db5" "db6")
    path=/home/luxia
    for db in ${db_list[@]}
    do
        cat <<EOF >>${path}/tmp.hql
            select * from ${db}.tb_name;
    EOF
    done
    >cat tmp.hql        
            select * from db1.tb_name;
            select * from db2.tb_name;
            select * from db3.tb_name;
            select * from db4.tb_name;
            select * from db5.tb_name;
            select * from db6.tb_name;

     代码二

    #!/bin/bash
    path=/home/username/...
    db_list=("db1" "db2" "db3" "db4" "db5" "db6")
    hive_url='jdbc:hive2://...;principal=hive/...'   #通过jdbc连接hive
    db_list=("db1" "db2" "db3" "db4" "db5" "db6")
    
    for db in ${db_list[@]}
    do
        cat <<EOF >>${path}/tmp.hql
            select * from ${db}.tb_name;    
    EOF                                        
    done                                              #循环拼接sql
    
    hql=${path}/tmp.hql
    beeline -u "${hive_url}" --silent=false [-hivevar var1=${var1}] -f $hql        #文件调用
    
    rm -f $hql
  • 相关阅读:
    HTTP方法(转)(学习基础)
    正则表达式 学习手记 111221
    原型模式 学习手记
    分布式事务 MSDTC配置
    Ibatis.Net 学习手记二 缓存
    IIS 7.0 部署MVC
    事务与分布式事务
    Ibatis+MVC 3.0 开发手记
    Ibatis.Net 学习手记一 简单的Demo
    简单工厂 学习手记
  • 原文地址:https://www.cnblogs.com/foolangirl/p/14132120.html
Copyright © 2011-2022 走看看