【发布时间】: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