我正在尝试为Hive编写一个查询,该查询使用系统日期来确定昨天的日期以及30天之前的日期。这将为我提供30天的滚动时间,而无需每次运行时都将日期范围手动输入到查询中。
我让该代码在CTE中正常工作。我遇到的问题是在另一个CTE中引用这些日期而没有将CTE结合在一起,这是我无法做到的,因为没有共同的领域可以加入。
我尝试了各种方法,但是每次都会收到“ ParseException”。
WITH
date_range AS (
SELECT
CAST(from_unixtime(unix_timestamp()-30*60*60*24,'yyyyMMdd') AS INT) AS start_date,
CAST(from_unixtime(unix_timestamp()-1*60*60*24,'yyyyMMdd') AS INT) AS end_date
)
SELECT * FROM myTable
WHERE date_id BETWEEN (SELECT start_date FROM date_range) AND (SELECT end_date FROM date_range)
预期结果是myTable中记录的集合,其记录的起始日期和结束日期之间的date_id在CTE date_range中找到。也许我要解决所有这些错误?
答案 0 :(得分:1)
您可以进行交叉联接,它不需要ON条件。您的date_range数据集仅是一行,如果需要,您可以将其与your_table交叉连接,并将其转换为map-join(您的小型数据集将广播到所有映射器,并加载到每个映射器内存中,并且将非常快地工作) ,请检查EXPLAIN
命令并确保它是map-join:
set hive.auto.convert.join=true;
set hive.mapjoin.smalltable.filesize=250000000;
WITH
date_range AS (
SELECT
CAST(from_unixtime(unix_timestamp()-30*60*60*24,'yyyyMMdd') AS INT) AS start_date,
CAST(from_unixtime(unix_timestamp()-1*60*60*24,'yyyyMMdd') AS INT) AS end_date
)
SELECT t.*
FROM myTable t
CROSS JOIN date_range d
WHERE t.date_id BETWEEN d.start_date AND d.end_date
如果这样,您也可以在where子句中计算日期:
SELECT t.*
FROM myTable t
CROSS JOIN date_range d
WHERE t.date_id
BETWEEN CAST(from_unixtime(unix_timestamp()-30*60*60*24,'yyyyMMdd') AS INT)
AND CAST(from_unixtime(unix_timestamp()-1*60*60*24,'yyyyMMdd') AS INT)