hadoop配置单元查询优化

yi0zb3m4  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(447)

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

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

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

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

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

r1zhe5dt

r1zhe5dt1#

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

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)
jq6vz3qz

jq6vz3qz2#

不幸的是,Hive不支持这一点。我过去也遇到过类似的问题,我的配置单元表在过去两年中都有分区。
不过,您可以做的一个变通方法是,您可以在shell脚本中运行此配置单元查询,在shell脚本中,您将在另一个变量中计算此日期,并将其用作配置单元查询中的变量。示例脚本如下:


# !/bin/bash

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

相关问题