将多个日期作为参数传递给Hive查询

时间:2019-07-10 02:01:22

标签: shell hive hiveql hadoop-partitioning

我正在尝试将日期列表作为参数传递给我的配置单元查询。

#!/bin/bash
echo "Executing the hive query - Get distinct dates"
var=`hive -S -e "select distinct  substr(Transaction_date,0,10) from test_dev_db.TransactionUpdateTable;"`
echo $var
echo "Executing the hive query - Get the parition data"
hive -hiveconf paritionvalue=$var -e 'SELECT Product FROM test_dev_db.TransactionMainHistoryTable where tran_date in("${hiveconf:paritionvalue}");'
echo "Hive query - ends"

输出为:

Executing the hive query - Get distinct dates
2009-02-01 2009-04-01
Executing the hive query - Get the parition data

Logging initialized using configuration in file:/hive/conf/hive-log4j.properties
OK
Product1
Product1
Product1
Product1
Product1
Product1
Time taken: 0.523 seconds, Fetched: 6 row(s)
Hive query - ends

仅输入第一个日期作为输入。我想将日期设为('2009-02-01','2009-04-01') 注意:TransactionMainHistoryTable在tran_date列上以字符串类型进行分区。

1 个答案:

答案 0 :(得分:2)

使用collect_set收集不同值的数组,并用定界符','将其连接起来。这将产生不带外部引号2009-02-01','2009-04-01的列表,并在第二个脚本中添加外部引号',或者您可以在第一个查询中添加它们。而且,在内联sql(-e选项)中执行时,您无需传递hiveconf变量,直接的shell变量替换将起作用。从文件(-f选项)执行脚本时,请使用hiveconf

工作示例:

date_list=$(hive -S -e "select concat_ws('\',\'',collect_set(substr(dt,0,10))) from (select stack (2,'2017-01', '2017-02')as dt)s ;")

hive -e "select * from (select stack (2,'2017-01', '2017-02')as dt)s where dt in ('${date_list}');"

返回:

2017-01
2017-02
Time taken: 1.221 seconds, Fetched: 2 row(s)