美文网首页
shell执行SQL脚本:hive -e和hive -f,及案例

shell执行SQL脚本:hive -e和hive -f,及案例

作者: 夜希辰 | 来源:发表于2021-12-19 17:04 被阅读0次
    借的一张图,胖熊

    hive -e
    “-e”不进入hive的交互窗口执行sql语句,hive -e 后面跟hivesql字符串

    bin/hive -e "select id from student;"
    

    hive -f
    “-f”执行脚本中sql语句

    bin/hive -f /export/servers/datas/hive.sql
    

    知道了语法,我们下面来看在实际工作中是怎么运用的

    一、hive -e 执行hivesql

    hive -e 执行的是sql字符串
    需求:在shell脚本中定义sql语句,并通过hive -e执行sql内容
    我们写个test_hive_e_2.sh脚本测试一下,脚本内容如下:
    备注:其实我就是想看一下加中文备注,加空格能不能执行

    #!/bin/bash
    
    #定义变量
    app=gmall
    
    #1、注意定义sql变量的时候等号左右两边不能有空格,刚执行这个脚本的时候报错,就是因为我变量右边有空格
    #2、看我这个sql分了这么多行,我主要是想验证sql分多行是否可执行、加 -- 注释知否可执行,哈哈,结果就是都可以执行的
    #3、这个sql里面还有个注意点,拼了一个app变量,shell双引号字符串中拼变量,直接带上变量名就可以了,
          #最好写成这样 ${变量名}
    sql="
    -- 测试
        select 
            mid_id    --    设备唯一标识
            ,user_id      --    用户标识
            ,version_code     --    程序版本号
            ,version_name     --    程序版本名
            ,lang     --    系统语言
            ,source   --    渠道号
            ,os   --    安卓系统版本
            ,area     --    区域
            ,model    --    手机型号
            ,brand    --    手机品牌
            ,sdk_version      --    sdkVersion
            ,gmail    --    gmail
            ,height_width     --    屏幕宽高
            ,app_time     --    客户端日志产生时的时间
            ,network      --    网络模式
            ,lng      --    经度
            ,lat      --    纬度
            ,entry    --    页面入口来源
        from ${app}.dwd_start_log --启动日志表
        limit 2;
    "
    #1、注意呀,hive -e 后面跟sql字符串
    hive -e "${sql}"
    

    来看下执行结果


    拓展1:shell中定义变量用双引号和单引号以及不用引号的区别
    • 使用单引号的情况下,不管里面的是否有变量或者其他的表达是都是原样子输出
    • 双引号:如果其定义变量的时候使用双引号的话,则里面的变量或者函数会通过解析,解析完成后再输出内容,而不是把双引号中的变量名以及命令原样子输出
    • 不使用引号:用于一些简单字符数字的定义与双引号类似

    拓展2:shell变量的特点

    • shell变量没有数据类型的区分
    • Shell 把任何存储在变量中的值,皆视为以字符组成的“字符串”
    • 变量值中存在空格,必须用双引号" "把值包括进来
    • =号、等号两边不能存在空格

    二、hive -f 执行hivesql

    hive -f 执行的是sql文件
    我们先编写一个sql脚本,然后在执行看下结果

    -- 测试
    -- 时间:20211226
    -- 功能:查询启动日志表数据
    -- hive脚本目前不支持多行注释,Hive脚本的注释目前好像只有 -- ,注释会写成 /**/会报错
    select 
        mid_id    --    设备唯一标识
        ,user_id      --    用户标识
        ,version_code     --    程序版本号
        ,version_name     --    程序版本名
        ,lang     --    系统语言
        ,source   --    渠道号
        ,os   --    安卓系统版本
        ,area     --    区域
        ,model    --    手机型号
        ,brand    --    手机品牌
        ,sdk_version      --    sdkVersion
        ,gmail    --    gmail
        ,height_width     --    屏幕宽高
        ,app_time     --    客户端日志产生时的时间
        ,network      --    网络模式
        ,lng      --    经度
        ,lat      --    纬度
        ,entry    --    页面入口来源
    from ${hivevar:database}.dwd_start_log --启动日志表
    limit 2;
    

    看一下执行结果

    hive -hivevar database='gmall' -f dwd_start_log_dql.sql
    
    #如果SQL脚本需要传递两个参数这样写
    #hive -hivevar enter_school_date="20130902" -hivevar min_ag="26" -f testvar.sql
    
    

    拓展1: hive SQL 脚本传参(-hivevar、-hiveconf)

    拓展2:Hive脚本中切勿使用/**/注释(hivesql脚本中 单行注释、多行注释)

    参考文章1:hive -e 和hive -f 的注意点 (//和////)

    相关文章

      网友评论

          本文标题:shell执行SQL脚本:hive -e和hive -f,及案例

          本文链接:https://www.haomeiwen.com/subject/izjofrtx.html