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 $

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

posted on 2021-08-06 14:53  桌子哥  阅读(252)  评论(0编辑  收藏  举报