Hadoop Hive查询优化

时间:2014-09-26 03:48:26

标签: hadoop hive mapr

我有一个以yyyyMMdd格式按日期分区的表。如果我这样做一个简单的查询:

SELECT COUNT(*) FROM MyTable WHERE Date >= '20140924'
然后它将扫描3天的数据(今天是第26天)。但是我希望我的查询总是查看最近3天,所以我这样写了

SELECT COUNT(*) FROM MyTable
WHERE date >= from_unixtime(unix_timestamp() - 259200, 'yyyyMMdd')

问题是现在它扫描每个分区。有没有办法让它在大于?

之后预先计算查询部分

2 个答案:

答案 0 :(得分:1)

不幸的是,Hive不支持这一点。我过去遇到过类似的问题,我的蜂巢表有过去2年的分区。

但是,您可以做的一个解决方法是,您可以在shell脚本中运行此配置单元查询,您将在另一个变量中计算此日期,并将其用作配置单元查询中的变量。示例脚本将是:

#!/bin/bash

date=`date +"%Y%m%d" -d "-3 days"`
hive -e "select count(*) from MyTable where date >= '$date'"

答案 1 :(得分:0)

一种解决方法是创建一个包含单行的表格,您可以从中选择计算的时间。

CREATE TABLE dual (dummy STRING);
INSERT INTO TABLE dual SELECT count(*) FROM dual;

SELECT COUNT(*) FROM MyTable t1
JOIN (
    SELECT from_unixtime(unix_timestamp() - 259200, 'yyyyMMdd') myDate
    FROM dual LIMIT 1
) t2 ON (t2.myDate = t1.Date)