zoukankan      html  css  js  c++  java
  • 向Hive中传入变量的方式

    Hive向程序中传递变量的方式

    • 暴力替换
      • 字符串替换
      • 正则替换
      • 模板引擎
    • 系统环境变量
      • shell环境变量:${env:varname}
      • system系统变量:${system:varname}
    • hive 命令参数
      • hivevar方式:${hivevar:varname}
      • hiveconf方式:${hiveconf:varname}

    hive接收外部变量方式详解

    • 使用Hive编写程序最常用的方法是将Hive语句写到文件中,然后使用hive -f filename.hql来批量执行查询语句。经常需要将外部参数传入到hql语句中替换其中的变量来动态执行任务,比如动态设定数据库名、表名、时间值、字段序列等变量,以达到脚本泛化执行的目的。
    • 在使用hive开发数据分析代码时,经常会遇到需要改变运行参数的情况,比如select语句中对日期字段值的设定,可能不同时间想要看不同日期的数据,这就需要能动态改变日期的值。如果开发量较大、参数多的话,使用变量来替代原来的字面值非常有必要,对传入的方式进行总结。

    数据准备

    • hive 表中创建数据
    use test;
     
    ---学生信息表
    create table IF NOT EXISTS student(
    sno bigint comment '学号' ,
    sname string comment '姓名' ,
    sage bigint comment '年龄' ,
    pdate string comment '入学日期'
    )
    COMMENT '学生信息表'
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY '	'
    LINES TERMINATED BY '
    '
    STORED AS TEXTFILE;
     
    LOAD DATA LOCAL INPATH
    '/home/users/root/testdata_student'
    INTO TABLE student;
    
    • 测试数据
    1 name1 21 20130901
    2 name2 22 20130901
    3 name3 23 20130901
    4 name4 24 20130901
    5 name5 25 20130902
    6 name6 26 20130902
    7 name7 27 20130902
    8 name8 28 20130902
    9 name9 29 20130903
    10 name10 30 20130903
    11 name11 31 20130903
    12 name12 32 20130904
    13 name13 33 20130904
    

    1-shell中设置变量,hive -e中直接使用

    • 测试脚本
    #!/bin/bash
    tablename="student"
    limitcount="8"
    hive -S -e "use test; select * from ${tablename} limit ${limitcount};"
    
    • 可以正常运行
    • 由于hive自身是类SQL语言,缺乏shell的灵活性和对过程的控制能力,所以采用shell+hive的开发模式非常常见,在shell中直接定义变量,在hive -e语句中就可以直接引用;

    注意

    • 注意:使用 hiveconf 定义,在hive -e中是不能使用的
    • 修改一下刚才的shell文件,采用-hiveconf的方法定义日期参数:
    #!/bin/bash
    tablename="student"
    limitcount="8"
     
    hive -S 
        -hiveconf enter_school_date="20130902" 
        -hiveconf min_age="26" 
        -e 
        "    use test; 
            select * from ${tablename} 
            where 
                pdate='${hiveconf:enter_school_date}' 
                and 
                sage>'${hiveconf:min_age}' 
            limit ${limitcount};"
    
    • 运行会失败,因为该脚本在shell环境中运行的,于是shell试图去解析{hiveconf:enter_school_date}和${hiveconf:min_age}变量,但是这两个SHELL变量并没有定义,所以会以空字符串放在这个位置。

    方法2:使用-hiveconf定义,在SQL文件中使用

    • 因为换行什么的很不方便,hive -e只适合写少量的SQL代码,所以一般都会写很多hql文件,然后使用hive –f 的方法来调用,这时候可以通过-hiveconf定义一些变量,然后在SQL中直接使用。
    • 先编写shell文件
    #!/bin/bash
     
    hive -hiveconf enter_school_date="20130902" -hiveconf min_ag="26" -f testvar.sql
    
    • 被调用脚本
    use test;
    select * from student
    where
    pdate='${hiveconf:enter_school_date}'
    and
    sage > '${hiveconf:min_ag}'
    limit 8;
    

    方法3:使用hivevar,再sql文件中使用

    • 再hql脚本中写使用set hivevar:varname的方式
    • 定义脚本
    #!/bin/bash
    hive -f testvar.sql
    
    • sql脚本
    use test;
    set hivevar:center_school_date="20130920";
    set hivevar:min_age="26";
    select * from student
    where
    pdate='${hivevar:enter_school_date}'
    and
    sage > '${hivevar:min_ag}'
    limit 8;
  • 相关阅读:
    cocos2dx 解释二具体的启动过程:内存管理和回调
    允许Android随着屏幕转动的控制自由转移到任何地方(附demo)
    freemarker 空白处理
    采用Duplicate target database在线恢复秩序oracle datagard图书馆设备
    activiti入门2流程引擎API和服务基础设施
    【android】ImageView的src和background以及两者之间的神奇的差异
    HDU ACM 1007 Quoit Design 分而治之的方法,最近点
    Dynamics CRM2013/2015 禁止欢迎屏幕(Disable the Welcome Screen)
    2013年第42周二明智行动的艺术
    2013第42周一睡前
  • 原文地址:https://www.cnblogs.com/sx66/p/12039577.html
Copyright © 2011-2022 走看看