能否以时间为维度创建Druid Lookup?无需新增小时维度可行吗?
无需新增小时维度也能实现基于时间的Lookup
当然可以不用在数据源里新增小时维度!你完全可以通过内置的日期时间表达式,直接从现有时间字段(比如时间戳、datetime类型字段)中提取或计算出一天中的时间区间/小时值,把它作为Lookup的输入维度。
给你举两个实用的例子:
1. 从时间戳提取小时并映射为时间段
假设你的数据源里有一个event_timestamp字段(格式为标准时间戳或datetime),可以直接用函数提取小时,再映射成你需要的时段名称:
{ "type":"lookup", "dimension": "HOUR(event_timestamp)", // 直接通过表达式提取小时值,无需新增维度 "outputName":"time_of_day", "outputType": "STRING", "retainMissingValue":true, "lookup":{ "type": "map", "map": { "0": "凌晨", "1": "凌晨", "2": "凌晨", "3": "凌晨", "4": "凌晨", "5": "凌晨", "6": "凌晨", "7": "上午", "8": "上午", // ... 依次补全9-12为上午,13-18为下午,19-23为晚上 "23": "晚上" }, "isOneToOne":true } }
如果想按区间批量映射(比如0-6点统一为凌晨),可以先对小时做分组计算,再映射:
{ "type":"lookup", "dimension": "CASE WHEN HOUR(event_timestamp) BETWEEN 0 AND 6 THEN '0-6' WHEN HOUR(event_timestamp) BETWEEN 7 AND 12 THEN '7-12' WHEN HOUR(event_timestamp) BETWEEN 13 AND 18 THEN '13-18' ELSE '19-23' END", "outputName":"time_of_day", "outputType": "STRING", "retainMissingValue":true, "lookup":{ "type": "map", "map": { "0-6": "凌晨", "7-12": "上午", "13-18": "下午", "19-23": "晚上" }, "isOneToOne":false // 多对一映射,设为false } }
2. 基于现有小时数值字段的映射
如果你的数据源里已经有了event_hour(0-23的数值字段),那直接用这个字段作为Lookup的维度就行,甚至不需要额外计算:
{ "type":"lookup", "dimension": "event_hour", "outputName":"time_slot", "outputType": "STRING", "retainMissingValue":true, "lookup":{ "type": "map", "map": { "0-6": "凌晨", "7-12": "上午", "13-18": "下午", "19-23": "晚上" }, "isOneToOne":false } }
核心逻辑就是:借助平台的日期时间处理函数,从已有时间字段中动态生成你需要的时间维度值,完全不需要修改数据源去新增字段。这样既灵活又能保持数据源的简洁性。
内容的提问来源于stack exchange,提问作者Climbs_lika_Spyder
相关产品推荐
相关产品推荐

