我是Hadoop、Linux的新手,已经有15年没有用Java编码了,所以我通常只使用Hue来运行查询。我的问题是,我试图在12个月的数据上运行一个基本的选择查询,然而,由于数据集的巨大规模和应用的读取阈值,这个查询总是会失败。因此,我需要每周/每月运行相同的查询,将结果插入到预先存在的表中,然后将它们聚合到我的最后12个月期间。
原始查询:-
SELECT col1, col2, col3
FROM foo
WHERE local_date >= '2013-09-01'
AND local_date < '2014-09-01'
可能的新脚本(PLSQL格式):-
DECLARE dtStart DATE;
DECLARE dtEnd DATE;
SET dtStart = (CURRENT_DATE - 1 YEAR) + 1 DAYS - DAY(CURRENT_DATE);
SET dtEnd = CURRENT_DATE + 1 DAYS - DAY(CURRENT_DATE);
WHILE dtStart < dtEnd THEN DO
INSERT INTO test
SELECT col1, col2, col3
FROM foo
WHERE local_date >= dtStart
AND local_date < dtStart + 7 DAYS;
IF dtStart = dtEnd THEN
SET dtStart = dtStart + 1 DAYS;
ELSEIF dtEnd - dtStart < 7 THEN
SET dtStart = dtStart + (dtEnd - dtStart) DAYS;
ELSE
SET dtStart = dtStart + 7 DAYS;
END IF;
END WHILE;
SELECT col1, col2, SUM(col3)
FROM test
GROUP BY col1, col2;
有人告诉我,这在顺化是不可能的。这是正确的吗?这可以在BASH中完成吗?或者我需要创建一些Java代码吗?正如你所看到的,我也希望日期是动态的,然而,我相信Hadoop中的日期函数无法做到这一点。
任何帮助都将不胜感激,特别是BASH或Jave中的例子,它们可以做一些类似的事情和/或为进一步阅读提供建议。
Hue有时会在涉及大量数据的查询中失败。然而,与其进行选择查询,不如将查询一年的输出重定向到另一个表中,看看它是否有效。
或者,您可以使用配置单元命令行客户端运行uery。请在那里试一下,看看是否有效。
你可以这样从shell使用它:
hive-e"从foo WHERE local_date>中选择col1、col2、col3='2013-09-01'和local_date<'2014-09-01"