Hadoop配置单元查询优化

Hadoop配置单元查询优化,hadoop,hive,mapr,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') 问题是现在它扫描每个

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

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

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

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

不幸的是,Hive不支持这一点。我过去也遇到过类似的问题,我的配置单元表在过去两年中都有分区

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

#!/bin/bash

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

一种解决方法是创建一个具有单行的表,从中可以选择计算时间

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)

我尝试了一下,但它似乎仍然可以扫描每个分区。也许是版本的问题?我正在使用配置单元0。12@MikeKulls有趣的是,如果您将日期移动到子查询,即从MyTable中选择COUNT*,其中date>=从\u unixtimeunix中选择\u timestamp-259200,'yyyyMMdd'从dual limit中选择,您能检查它是否仍然扫描每个分区吗?1我根本无法让它工作。我无法识别“选择”附近的输入。我尝试过各种子查询,甚至像从Dual中选择'20140926'和DT一样简单。我认为这并不理想,但可能是最好的解决方案。一般来说,当我在过去编写sql时,它总是从其他语言调用,这样的事情很容易做到。没有理由它会与hive有任何不同。我还尝试了各种其他方法,通过使用连接等在hive中完成它,但没有真正起作用……因此,在尽可能使用shell的情况下,我尝试使用它来运行查询