我的表结构是这样的:
hive> describe user_data2;
OK
received_at string
message_id string
type string
version string
timestamp_user string
user_id string
sent_at string
channel string
time_log string
我的目标是这个领域,
hive> select received_at, time_log, user_id from user_data2 limit 5;
OK
2016-01-08T12:27:05.565Z 1452256025 836871
2016-01-08T12:27:12.634Z 1452256033 800798
2016-01-08T12:27:12.632Z 1452256033 795799
2016-01-08T12:27:13.694Z 1452256033 820359
2016-01-08T12:27:15.821Z 1452256036 294141
在此我想进行基于时间的查询。喜欢
- 平均活跃小时数;每月;期间:过去 12 个月
- % 的用户在 0-1 小时/天之间活跃
- % 的用户在 1-2 小时/天之间活跃
- % 的用户在 2-4 小时/天之间活跃
- % 的用户在 4-8 小时/天之间活跃
- % 的用户在 8-12 小时/天之间活跃
- % 的用户在 12-16 小时/天之间活跃
- % 的用户在 16-24 小时/天之间活跃
我得到了一些使用日期时间 UDF 的线索 - https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-DateFunctions
但我不知道如何使用这个功能。
我试过:
select unix_timestamp(received_at) from user_data2 limit 5;
OK
NULL
NULL
NULL
NULL
NULL
什么都不给。
如果有人给出使用时间 UDF 并在两小时或其他时间范围内获取记录的示例,我将不胜感激。
最佳答案
假设您本地的 TZ 是罗马...
select
from_utc_timestamp(regexp_replace(regexp_replace(RECEIVED_AT, 'T',' '), '\\..*$',''), 'Europe/Rome') as TS_RECEIVED,
cast(from_unixtime(cast(TIME_LOG as int)) as timestamp) as TS_LOGGED
from WTF ;
+------------------------+------------------------+--+
| ts_received | ts_logged |
+------------------------+------------------------+--+
| 2016-01-08 13:27:05.0 | 2016-01-08 13:27:05.0 |
+------------------------+------------------------+--+
关于hadoop - Hive 表的基于时间的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34786529/