【问题标题】:Hive: Filtering rows based on a range of TimeHive:根据时间范围过滤行
【发布时间】:2017-09-26 03:37:46
【问题描述】:

我是这个论坛的新手,这是我的第一个问题。我确实在这个论坛上搜索过解决方案,但仍然无法获得确切的解决方案。如果已经回答了此类问题,那么我提前道歉。

现在回到我的问题。我有一个具有以下列的 HIVE 表“table1”:

频道名称字符串 开始时间字符串 prog_name 字符串 成本翻倍

以下是上表中的示例日期:

BBC 2016-11-24 05:47:02 新:Wonder World 191.0 GTV 2016-11-24 21:35:58 新:大逃亡 99.0 BBC 2016-11-25 21:43:29 新:Wonder World 131.0 GTV 2016-11-25 23:32:56 新:恐惧状态 145.0 GTV 2016-11-26 01:30:30 新:大逃亡 128.0

我必须根据 UI 上的过滤器找出成本,其中用户可以按程序名称和时间范围从 0-5、6-10、11-15...19-24 等桶中过滤。我在 HIVE 查询下开发应该根据程序和用户过滤的时间段来选择每一行。无论日期如何,我都必须比较整个时间戳值的时间部分。

以下是我尝试过的 HIVE 查询,但无法比较并给出错误:

SELECT sum(cost)
  FROM table1
  WHERE prog_name='NEW: Wonder World'
  AND (cast(substr(start_time, 12) AS TIMESTAMP) BETWEEN (00:00:00
                                                          AND 05:59:59)
       OR cast(substr(start_time, 12) AS TIMESTAMP) BETWEEN (06:00:00
                                                             AND 09:59:59));

失败:ParseException 行 1:118 无法识别 ':' '00' 附近的输入 ':' 在表达式规范中

仅从时间戳值转换和比较时间部分的正确语法是什么?感谢上述查询的任何建议/指针。

【问题讨论】:

  • 时间间隔没有意义。
  • 共有 5 个桶代表 24 小时,即 '0-6'、'6-10'、'10-14'、'14-19'、'19-24'。为了找到成本,不考虑日期,而只考虑时间。因此,如果“New: Wonder World”程序的 start_time 是“2016-09-08 12:46:25”和“2016-09-07 21:48:49”,则两者都将在“10-14”桶中考虑'和'19-24'。因此 where 子句将是 substr(start_time, 12) 介于 '10:00:00' 和 '14:59:59' 之间或 substr(start_time, 12) 介于 '19:00:00' 和 '23:59:59' 之间')
  • OR 由两个实际创建单个区间的条件组合而成

标签: hive


【解决方案1】:
select  sum(cost)   as sum_cost

from    table1 

where   prog_name='NEW: Wonder World' 
    and substr(start_time,12) between '00:00:00' and '09:59:59'
;

+-----------+
| sum_cost  |
+-----------+
| 191       |
+-----------+

【讨论】:

  • 谢谢你!它有效:) 只是一个简单的缺少单引号和额外的圆括号是问题所在。而且,我们甚至不需要将 String 转换为 Timestamp 数据类型,HIVE 内部会这样做。这是一个很大的帮助,节省了我很多时间。否则,我计划使用 case 语句将行分组到每个存储桶中并使用子查询。
  • 不客气。附言。时间戳包括日期,这个id只是一个简单的字符串比较。 P.s.2 fon'y 忘记接受答案
  • 所以下面的查询会在不考虑日期的情况下给我整个 24 小时的所有结果,对吧?选择 sum(cost) as sum_cost from table1 where prog_name='NEW: Wonder World' and (substr(start_time, 12) between '00:00:00' and '05:59:59' or substr(start_time, 12) between '06:00:00' 和 '09:59:59' 或 substr(start_time, 12) 介于 '10:00:00' 和 '14:59:59' 或 substr(start_time, 12) 之间 '15:00 :00' 和 '18:59:59' 或 substr(start_time, 12) 在 '19:00:00' 和 '23:59:59' 之间);
猜你喜欢
  • 1970-01-01
  • 2020-02-15
  • 1970-01-01
  • 2021-02-11
  • 1970-01-01
  • 2016-11-25
  • 2015-05-16
  • 2014-07-22
  • 1970-01-01
相关资源
最近更新 更多