zoukankan      html  css  js  c++  java
  • Hive中将结果表数据获取并且重新以参数形式赋予到SQL脚本中的一种实践办法

    最近使用Hive来加工一批数据形成标签宽表,其中有一部分的标签需要根据统计规律来进行标定,而这些统计规律是需要依赖于之前的结果表。

    例如,需要统计规律的结果表如下:

    -- 参数设置
    SET hivevar:param_1 = ${hiveconf:param_1};
    SET hivevar:param_2 = ${hiveconf:param_2};

    -- 建表
    DROP
    TABLE IF EXISTS tmp_result; CREATE TABLE IF NOT EXISTS tmp_result AS SELECT a.*, CASE WHEN a.field_example > 0 AND a.field_example <= COALESCE(${hivevar:param_1},0) THEN '1' WHEN a.field_example > COALESCE(${hivevar:param_1},0) AND a.field_example <= COALESCE(${hivevar:param_2},0) THEN '2' WHEN a.field_example > COALESCE(${hivevar:param_2},0) THEN '3' ELSE ' ' END AS level_1 FROM tmp_origin AS a ;

    对于参数param_1param_2而言,其来自于tmp_origin表,需要一个shell脚本来进行设计

    #!/bin/bash
    
    # 参数
    # tmp_result存在的位置
    sqlpath=$1 
    # 参数设置
    param_all=`hive -e "
    USE database;
    (SELECT CAST('5566' AS DOUBLE))
    UNION ALL
    (SELECT percentile(CAST(field_example AS INT),0.33) FROM tmp_origin WHERE field_example!='0')
    UNION ALL
    (SELECT percentile(CAST(field_example AS INT),0.66) FROM tmp_origin WHERE field_example!='0')
    ;"`

    通过上述的shell脚本可以将数据取出来但是不是最终的,需要继续在shell脚本中截取数据使用awk,在本次的案例中需要去除掉空格使用sed

    # 截取变量
    tmp_param=`echo $param_all | awk -F "5566" '{print $2}'`
    param_1=`echo $tmp_param | awk '{print $1}' | sed s/[[:space:]]//g`
    param_2=`echo $tmp_param | awk '{print $2}' | sed s/[[:space:]]//g`

    最后就是执行了,如果想看执行结果也可以echo来看一下

    hive -hiveconf param_1=${param_1}   
    -hiveconf param_2=${param_2}
    -f ${sqlpath#*=}
    echo $

    这样就可以啦!按照需要可以用过分区或者是设计程序来实现动态的数据抽取与查询。

  • 相关阅读:
    bzoj 2216 Lightning Conductor
    一些有趣的问题合集
    Codeforces 40E Number Table
    Codeforces 37D Lesson Timetable
    bzoj 4289 Tax
    bzoj 2844 albus就是要第一个出场
    bzoj 2115 Xor
    luogu 3790 文艺数学题
    bzoj 1420 Discrete Root
    Lucas定理学习笔记
  • 原文地址:https://www.cnblogs.com/zhuozige/p/15108580.html
Copyright © 2011-2022 走看看