Hive 蜂巢中的日期比较
我正在使用Hive,我有一个如下结构的表:Hive 蜂巢中的日期比较,hive,timestamp,hiveql,ddl,Hive,Timestamp,Hiveql,Ddl,我正在使用Hive,我有一个如下结构的表: CREATE TABLE t1 ( id INT, created TIMESTAMP, some_value BIGINT ); 我需要找到t1中小于180天的每一行。即使表中存在与搜索谓词匹配的数据,以下查询也不会生成任何行 select * from t1 where created > date_sub(from_unixtime(unix_timestamp()), 180); 在Hive中执行日期比较的合适方式是什
CREATE TABLE t1 (
id INT,
created TIMESTAMP,
some_value BIGINT
);
我需要找到t1
中小于180天的每一行。即使表中存在与搜索谓词匹配的数据,以下查询也不会生成任何行
select *
from t1
where created > date_sub(from_unixtime(unix_timestamp()), 180);
在Hive中执行日期比较的合适方式是什么?在回顾了这一点并参考了我提出的解决方案后。虽然我不确定为什么Hive不能有效地将日期作为字符串进行比较(它们应该按字典顺序进行排序和比较),但以下解决方案是有效的:
FROM (
SELECT id, value,
unix_timestamp(created) c_ts,
unix_timestamp(date_sub(from_unixtime(unix_timestamp()), 180), 'yyyy-MM-dd') c180_ts
FROM t1
) x
JOIN t1 t ON x.id = t.id
SELECT to_date(t.Created),
x.id, AVG(COALESCE(x.HighestPrice, 0)), AVG(COALESCE(x.LowestPrice, 0))
WHERE unix_timestamp(t.Created) > x.c180_ts
GROUP BY to_date(t.Created), x.id ;
那么:
where unix_timestamp() - created < 180 * 24 * 60 * 60
浏览每个UDF:
unix\u timestamp()
返回一个int:自epoch以来的当前时间(以秒为单位)from_unixtime(,'yyyy-MM-dd')
转换为给定格式的字符串,例如'2012-12-28'date\u sub(,180)
从该字符串中减去180天,并以相同格式返回一个新字符串unix\u时间戳(,'yyyy-MM-dd')
将该字符串转换回int如果这一切变得太复杂,你可以自己编写一个UDF。我认为这可能是一个处理时间戳类型的蜂巢bug。我最近一直在尝试使用它,但结果不正确。 如果我将您的模式更改为使用字符串而不是时间戳,并在 yyyy MM dd HH:MM:ss 格式化,然后选择查询对我有效 根据文档,Hive应该能够将表示历元秒的BIGINT转换为时间戳,并且所有现有的datetime UDF都使用时间戳数据类型 通过这个简单的查询: 从unix\u timestamp()中选择,将unix\u timestamp()转换为 时间戳)从测试限制1开始 我希望这两个字段是相同的,但我得到: 2012-12-29 00:47:43 1970-01-16 16:52:22.063
我也看到了其他奇怪之处。或者,您也可以使用datediff。那么where子句将是
如果是字符串时间戳(jdbc格式):
datediff(从unixtime(unix\u timestamp()),创建)<180;
如果是Unix纪元时间:
datediff(from_unixtime(unix_timestamp()), from_unixtime(created)) < 180;
datediff(from_unixtime(unix_timestamp()),from_unixtime(created))<180;
时间戳为毫秒unix\u时间戳以秒为单位
你需要把RHS乘以1000
where created > 1000 * date_sub(from_unixtime(unix_timestamp()), 180);
对我最终使用的解决方案的精彩解释。一个问题-在这种情况下,
时间戳
/字符串
与INT
之间的比较是否可行?后续问题-时间戳/字符串
与INT
之间的比较是否可行。感谢您提供的这些信息,它很好地简化了查询。这看起来像在中报告的,但还没有做任何工作来修复它,因为配置单元维护人员希望确保与损坏的行为向后兼容。@JeremiahPeschka谢谢,plus有解决方法。。。我也应该在那里搜索我的其他时间戳问题。
datediff(from_unixtime(unix_timestamp()), from_unixtime(created)) < 180;
where created > 1000 * date_sub(from_unixtime(unix_timestamp()), 180);