我有一个Hive表,它按年、月、日和小时划分。我需要对它运行一个查询来获取过去7天的数据。这是在 Hive 0.14.0.2.2.4.2-2
. 我的查询当前如下所示:
SELECT COUNT(column_name) from table_name
where year >= year(date_sub(from_unixtime(unix_timestamp()), 7))
AND month >= month(date_sub(from_unixtime(unix_timestamp()), 7))
AND day >= day(date_sub(from_unixtime(unix_timestamp()), 7));
这需要很长时间。当我用实际数字代替上面的数字时,我会说:
SELECT COUNT(column_name) from table_name
where year >= 2017
AND month >= 2
AND day >= 13
几分钟后就结束了。有没有办法改变上面的脚本,使它实际上只包含查询中的数字而不是函数?
我试过用 set
比如:
set yearLimit = year(date_sub(from_unixtime(unix_timestamp()), 7));
SELECT COUNT(column_name) from table_name
where year >= ${hiveconf:yearLimit}
AND month >= month(date_sub(from_unixtime(unix_timestamp()), 7))
AND day >= day(date_sub(from_unixtime(unix_timestamp()), 7));
但这并不能解决问题。
1条答案
按热度按时间vlurs2pr1#
解决方案
原始查询出了什么问题?
unix\u时间戳()
以秒为单位获取当前unix时间戳。这个函数是不确定的,并且它的值对于查询执行的范围不是固定的,因此妨碍了对查询的适当优化-从2.0开始,这个函数就被弃用,取而代之的是当前的\u timestamp常量。
https://cwiki.apache.org/confluence/display/hive/languagemanual+udf
(我只是稍微修改了一下文档:-)
由于unix\u timestamp()的值在执行过程中可能会更改,因此应该为每一行计算表达式,从而防止分区消除。
为什么使用set不起作用?
set
不过是一种文本替换机制。过程中没有计算任何内容
set
.唯一发生的事情是变量被分配了一个文本。
在执行查询之前,变量占位符(
${hiveconf:...}
)正在替换为指定的文本。只有这样,查询才会被解析和执行。
演示
{“input\u partitions”:[{“partitionname”:default@table_name@year=2016/month=11/天=14“},{“分区名称”:default@table_name@year=2016/month=11/天=15“},{“分区名称”:default@table_name@year=2016/month=11/天=16“},{“分区名称”:default@table_name@year=2016/month=11/天=17“},{“分区名称”:default@table_name@year=2016/month=11/天=18“},{“分区名称”:default@table_name@year=2016/month=11/天=19“},{“分区名称”:default@table_name@year=2016/month=11/天=20“},{“分区名称”:default@table_name@year=2016/month=11/天=21“},{“分区名称”:default@table_name@year=2016/month=11/天=22“},{“分区名称”:default@table_name@year=2016/month=11/天=23“},{“分区名称”:default@table_name@year=2016/month=11/天=24“},{“分区名称”:default@table_name@year=2016/month=11/天=25“},{“分区名称”:default@table_name@year=2016/month=11/天=26“},{“分区名称”:default@table_name@year=2016/month=11/天=27“},{“分区名称”:default@table_name@year=2016/month=11/天=28“},{“分区名称”:default@table_name@year=2016/month=11/天=29“},{“分区名称”:default@table_name@year=2016/month=11/天=30“},{“分区名称”:default@table_name@year=2016/month=12/天=1“},{“分区名称”:default@table_name@year=2016/month=12/天=10“},{“分区名称”:default@table_name@year=2016/month=12/天=11“},{“分区名称”:default@table_name@year=2016/month=12/天=12“},{“分区名称”:default@table_name@year=2016/month=12/天=13“},{“分区名称”:default@table_name@year=2016/month=12/天=14“},{“分区名称”:default@table_name@year=2016/month=12/天=15“},{“分区名称”:default@table_name@year=2016/month=12/天=16“},{“分区名称”:default@table_name@year=2016/month=12/天=17“},{“分区名称”:default@table_name@year=2016/month=12/天=18“},{“分区名称”:default@table_name@year=2016/month=12/天=19“},{“分区名称”:default@table_name@year=2016/month=12/天=2“},{“分区名称”:default@table_name@year=2016/month=12/天=20“},{“分区名称”:default@table_name@year=2016/month=12/天=21“},{“分区名称”:default@table_name@year=2016/month=12/天=22“},{“分区名称”:default@table_name@year=2016/month=12/天=23“},{“分区名称”:default@table_name@year=2016/month=12/天=24“},{“分区名称”:default@table_name@year=2016/month=12/天=25“},{“分区名称”:default@table_name@year=2016/month=12/天=26“},{“分区名称”:default@table_name@year=2016/month=12/天=27“},{“分区名称”:default@table_name@year=2016/month=12/天=28“},{“分区名称”:default@table_name@year=2016/month=12/天=29“},{“分区名称”:default@table_name@year=2016/month=12/天=3“},{“分区名称”:default@table_name@year=2016/month=12/天=30“},{“分区名称”:default@table_name@year=2016/month=12/天=31“},{“分区名称”:default@table_name@year=2016/month=12/天=4“},{“分区名称”:default@table_name@year=2016/month=12/天=5“},{“分区名称”:default@table_name@year=2016/month=12/天=6“},{“分区名称”:default@table_name@year=2016/month=12/天=7“},{“分区名称”:default@table_name@year=2016/month=12/天=8“},{“分区名称”:default@table_name@year=2016/month=12/天=9“},{“分区名称”:default@table_name@year=2017/month=1/天=1“},{“分区名称”:default@table_name@year=2017/month=1/天=10“},{“分区名称”:default@table_name@year=2017/month=1/天=11“},{“分区名称”:default@table_name@year=2017/month=1/天=12“},{“分区名称”:default@table_name@year=2017/month=1/天=13“},{“分区名称”:default@table_name@year=2017/month=1/天=14“},{“分区名称”:default@table_name@year=2017/month=1/天=15“},{“分区名称”:default@table_name@year=2017/month=1/天=16“},{“分区名称”:default@table_name@year=2017/month=1/天=17“},{“分区名称”:default@table_name@year=2017/month=1/天=18“},{“分区名称”:default@table_name@year=2017/month=1/天=19“},{“分区名称”:default@table_name@year=2017/month=1/天=2“},{“分区名称”:default@table_name@year=2017/month=1/天=20“},{“分区名称”:default@table_name@year=2017/month=1/天=21“},{“分区名称”:default@table_name@year=2017/month=1/天=22“},{“分区名称”:default@table_name@year=2017/month=1/天=23“},{“分区名称”:default@table_name@year=2017/month=1/天=24“},{“分区名称”:default@table_name@year=2017/month=1/天=25“},{“分区名称”:default@table_name@year=2017/month=1/天=26“},{“分区名称”:default@table_name@year=2017/month=1/天=27“},{“分区名称”:default@table_name@year=2017/month=1/天=28“},{“分区名称”:default@table_name@year=2017/month=1/天=29“},{“分区名称”:default@table_name@year=2017/month=1/天=3“},{“分区名称”:default@table_name@year=2017/month=1/天=30“},{“分区名称”:default@table_name@year=2017/month=1/天=31“},{“分区名称”:default@table_name@year=2017/month=1/天=4“},{“分区名称”:default@table_name@year=2017/month=1/天=5“},{“分区名称”:default@table_name@year=2017/month=1/天=6“},{“分区名称”:default@table_name@year=2017/month=1/天=7“},{“分区名称”:default@table_name@year=2017/month=1/天=8“},{“分区名称”:default@table_name@year=2017/month=1/天=9“},{“分区名称”:default@table_name@year=2017/month=2/天=1“},{“分区名称”:default@table_name@year=2017/month=2/天=10“},{“分区名称”:default@table_name@year=2017/month=2/天=11“},{“分区名称”:default@table_name@year=2017/month=2/天=12“},{“分区名称”:default@table_name@year=2017/month=2/天=13“},{“分区名称”:default@table_name@year=2017/month=2/天=14“},{“分区名称”:default@table_name@year=2017/month=2/天=15“},{“分区名称”:default@table_name@year=2017/month=2/天=16“},{“分区名称”:default@table_name@year=2017/month=2/天=17“},{“分区名称”:default@table_name@year=2017/month=2/天=18“},{“分区名称”:default@table_name@year=2017/month=2/天=19“},{“分区名称”:default@table_name@year=2017/month=2/天=2“},{“分区名称”:default@table_name@year=2017/month=2/天=20“},{“分区名称”:default@table_name@year=2017/month=2/天=21“},{“分区名称”:default@table_name@year=2017/month=2/天=3“},{“分区名称”:default@table_name@year=2017/month=2/天=4“},{“分区名称”:default@table_name@year=2017/month=2/天=5“},{“分区名称”:default@table_name@year=2017/month=2/天=6“},{“分区名称”:default@table_name@year=2017/month=2/天=7“},{“分区名称”:default@table_name@year=2017/month=2/天=8“},{“分区名称”:default@table_name@year=2017/month=2/天=9“}],“input_tables”:[{“tablename”:default@table_name“,”tabletype“:”托管表“}]}
{“input\u partitions”:[{“partitionname”:default@table_name@year=2017/month=2/天=14“},{“分区名称”:default@table_name@year=2017/month=2/天=15“},{“分区名称”:default@table_name@year=2017/month=2/天=16“},{“分区名称”:default@table_name@year=2017/month=2/天=17“},{“分区名称”:default@table_name@year=2017/month=2/天=18“},{“分区名称”:default@table_name@year=2017/month=2/天=19“},{“分区名称”:default@table_name@year=2017/month=2/天=20“},{“分区名称”:default@table_name@year=2017/month=2/天=21“}],“input_tables”:[{“tablename”:default@table_name“,”tabletype“:”托管表“}]}