如何在Hive SQL中基于reading_date按每10天间隔提取数据?
Hive SQL实现按10天间隔筛选数据的解决方案
问题背景
你手头有一张名为t1的表,数据和结构如下:
| t1.reading_date | t1.use_date | t1.name | t1.reading_pct |
|---|---|---|---|
| 12/17/2019 | 12/11/2019 | file1 | 75.00915527 |
| 12/22/2019 | 12/11/2019 | file1 | 75.5859375 |
| 12/27/2019 | 12/11/2019 | file1 | 76.90429688 |
| 1/1/2020 | 12/11/2019 | file1 | 74.29199219 |
| 1/2/2020 | 12/11/2019 | file1 | 64.93835449 |
| 1/7/2020 | 12/11/2019 | file1 | 65.10620117 |
| 1/12/2020 | 12/11/2019 | file1 | 66.90063477 |
| 1/17/2020 | 12/11/2019 | file1 | 66.47033691 |
| 1/22/2020 | 12/11/2019 | file1 | 66.35131836 |
| 1/27/2020 | 12/11/2019 | file1 | 59.61303711 |
你的需求是:从reading_date的最小值到最大值,按每10天的间隔筛选数据,得到指定格式的结果集。
实现代码
直接上可以运行的Hive SQL代码,我会一步步给你解释:
WITH date_converted AS ( -- 转换日期格式并计算每条记录与最小日期的天数差 SELECT reading_date, use_date, name, reading_pct, to_date(reading_date, 'MM/dd/yyyy') AS reading_dt, datediff(to_date(reading_date, 'MM/dd/yyyy'), MIN(to_date(reading_date, 'MM/dd/yyyy')) OVER ()) AS days_diff FROM t1 ) SELECT reading_date AS `new(t1.reading_date)`, use_date, name, reading_pct FROM date_converted WHERE days_diff % 10 = 0 ORDER BY reading_date;
代码拆解说明
- 日期格式转换:因为你的
reading_date是字符串类型(比如12/17/2019),Hive没法直接做日期计算,所以先用to_date()把它转成Hive支持的日期类型,指定格式为MM/dd/yyyy(月/日/年)。 - 计算天数差:用窗口函数
MIN() OVER ()可以拿到整个表中最早的reading_date,然后用datediff()函数算出当前记录的日期和这个最早日期之间差了多少天,结果存在days_diff字段里。 - 筛选间隔记录:咱们要的是每10天的记录,也就是
days_diff为0、10、20...的记录,直接用days_diff % 10 = 0就能精准筛选出来——这一步就是核心,对应你要的每10天间隔的要求。 - 整理输出:最后把
reading_date列重命名为你要的new(t1.reading_date),再按日期排序,就得到你想要的结果啦。
如果你的reading_date字段本身已经是Hive的日期类型,那可以去掉to_date()转换的部分,直接计算天数差就行,代码会更简洁。
内容的提问来源于stack exchange,提问作者Dia
相关产品推荐
相关产品推荐

