如何在 Hive SQL 中为日期列执行 BETWEEN 运算符

Posted

技术标签:

【中文标题】如何在 Hive SQL 中为日期列执行 BETWEEN 运算符【英文标题】:How to perform a BETWEEN operator in Hive SQL for date column 【发布时间】:2017-05-15 20:32:07 【问题描述】:

我会尽可能清楚地解释我的问题。我想按日期过滤表(只选择日期包含在当前月份中的记录),在 Oracle SQL 中我使用以下查询来实现这样的目标:

select * from table t1 
where t1.DATE_COLUMN between TRUNC(SYSDATE, 'mm') and SYSDATE

如何在 Hive SQL 中复制相同的过滤器?我应该用来应用过滤器的列是 TIMESTAMP 类型的列(例如 2017-05-15 00:00:00)。

我正在使用 CDH 5.7.6-1。

有什么建议吗?

【问题讨论】:

DATE_COLUMN是分区列吗? @DuduMarkovitz 不,它不是分区列。 【参考方案1】:

请注意,unix_timestamp 不是固定的,在查询期间会发生变化。 因此,它不能用于分区消除。 对于较新的 Hive 版本,请改用 current_date / current_timestamp

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF

select  * 
from    table t1 
where   t1.DATE_COLUMN  
          between  cast(from_unixtime(unix_timestamp(),'yyyy-MM-01 00:00:00') as timestamp)
          and      cast(from_unixtime(unix_timestamp()) as timestamp)
;

select  cast (from_unixtime(unix_timestamp(),'yyyy-MM-01 00:00:00') as timestamp)
       ,cast (from_unixtime(unix_timestamp()) as timestamp)
;

+---------------------+---------------------+
|         _c0         |         _c1         |
+---------------------+---------------------+
| 2017-05-01 00:00:00 | 2017-05-16 01:04:55 |
+---------------------+---------------------+

【讨论】:

【参考方案2】:

您可以格式化为字符串:

where date_format(t1.DATE_COLUMN, 'y-m') = date_format(current_timestamp, 'y-m')

我意识到我现在无法访问 Hive。文档建议'y-m',但Java 文档建议'yyyy-mm'

【讨论】:

我已经按照您的建议进行了尝试,但出现语义异常错误“Invalid function date_format.

以上是关于如何在 Hive SQL 中为日期列执行 BETWEEN 运算符的主要内容,如果未能解决你的问题,请参考以下文章

如何在堆叠栏中为每个日期范围显示多个堆叠列

如何在 sql server 2008R2/ssis 中为每个日期导出带有日期时间的单独 excel 表?

我们可以在 HIVE 中为 BIGINT 列设置空值吗

如何在 SQL Server 的单个批次中为列添加默认值并使用默认值更新所有行?

如何使用 HIVE 以其他格式更改或修改日期列值

在子查询中为数据透视列的值实现 WHERE 子句?