如何在 Hive SQL 中按日期范围独家加入?

Posted

技术标签:

【中文标题】如何在 Hive SQL 中按日期范围独家加入?【英文标题】:How to join exclusively by date range in Hive SQL? 【发布时间】:2019-10-03 17:07:49 【问题描述】:

我有两个子查询,我只想按第一个表的开放日期和关闭日期之间的日期范围加入。

第一个表格示例:

| id_original | open_datetime     | close_datetime    |
|-------------|-------------------|-------------------|
|      1      |2019-01-01 10:00:02|2019-01-02 11:00:21|
|      2      |2019-01-01 10:05:52|2019-01-05 16:45:12|
|      3      |2019-01-03 00:00:43|2019-01-03 23:12:44|

第二个表格示例:

| category | all other columns...| open_date         |
|----------|---------------------|-------------------|
|    A     |        ...          |2019-01-01 11:00:00|
|    B     |        ...          |2019-01-02 19:10:10|
|    C     |        ...          |2019-01-03 08:23:45|
|    D     |        ...          |2019-01-04 18:10:53|

期望的输出:

| id_original | category | all other columns...| open_date         |
|-------------|----------|---------------------|-------------------|
|      1      |    A     |        ...          |2019-01-01 11:00:00|
|      2      |    A     |        ...          |2019-01-01 11:00:00|
|      2      |    B     |        ...          |2019-01-02 19:10:10|
|      2      |    C     |        ...          |2019-01-03 08:23:45|
|      2      |    D     |        ...          |2019-01-04 18:10:53|
|      3      |    C     |        ...          |2019-01-03 08:23:45|

这是我的代码:

SELECT *
FROM (
    SELECT id, open_datetime, close_datetime
    FROM table1
    WHERE id IN (list_of_ids)
) t1
LEFT JOIN (
    SELECT *
    FROM table2
    WHERE other_conditions
) t2 ON t2.open_date >= t1.open_datetime AND t2.open_date <= t1.close_datetime

我知道 Hive SQL 不支持将不等式作为JOIN 的条件。但是我应该如何处理这个问题呢?

注意:我需要的 join 专门用于日期,t1 和 t2 中没有相等的键可以用来加入它们。

谢谢!

【问题讨论】:

【参考方案1】:

将连接条件移至 WHERE 子句。在这种情况下,LEFT JOIN 被转化为 CROSS,因为你没有其他的连接条件,而无条件连接就是 CROSS-join。在交叉连接之后,过滤 WHERE 子句中的行。尽管如果无法过滤行或通过其他键连接以避免 CROSS 产品,则 CROSS 连接可能会导致严重的性能问题。如果其中一张表小到可以放入内存,CROSS-join 将作为 map-join 执行,这也有助于提高性能。

set hive.auto.convert.join=true;
set hive.mapjoin.smalltable.filesize=512000000; --try to set it bigger and see if map-join works
                                                --setting too big value may cause OOM exception 

SELECT *
FROM (
    SELECT id, open_datetime, close_datetime
    FROM table1
    WHERE id IN (list_of_ids)
) t1
CROSS JOIN 
(
    SELECT *
    FROM table2
    WHERE other_conditions
) t2 
WHERE (t2.open_date >= t1.open_datetime AND t2.open_date <= t1.close_datetime)
   OR t2.category is NULL --to allow absence of t2 like in LEFT join
;

【讨论】:

以上是关于如何在 Hive SQL 中按日期范围独家加入?的主要内容,如果未能解决你的问题,请参考以下文章

SQL中按日期进行查询,如何截取日期进行查询

如何在 django 中按日期范围过滤记录?

如何在SQL中按时间段查询数据

在熊猫中按范围加入/合并的最佳方式

银条。在 ModelAdmin 中按日期范围搜索

spark sql怎么去获取hive 表一定日期范围内的数据