2

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

SELECT COUNT(*) FROM MyTable WHERE Date >= '20140924'

然后它将扫描3天的数据(今天是26号)。但是我希望我的查询总是查看过去 3 天,所以我这样写

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

问题是现在它扫描每个分区。有没有办法让它预先计算大于之后的查询部分?

4

2 回答 2

1

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

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

#!/bin/bash

date=`date +"%Y%m%d" -d "-3 days"`
hive -e "select count(*) from MyTable where date >= '$date'"
于 2014-09-26T09:21:55.167 回答
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)
于 2014-09-26T14:48:25.853 回答