简介
数仓中经常有数组型的字段需求, 比如: 影片类型=[“科幻”,”悬疑”]
在传统关系型数据库中, 这类信息一般用分隔符存储为: 影片类型=科幻,悬疑
以下讨论数仓业务中的处理方法.
查询对比 (使用 sybn jdbc driver 访问以下数据库)
项目 | 字段类型 | 存储 | 普通查询 | in查询 |
---|---|---|---|---|
mysql | 文本 | type=”科幻,悬疑” | type like ‘科幻’ #不严谨 | 不支持 |
mongo | 数组 | type=[“科幻”,”悬疑”] | type = “科幻” | type in (“科幻”,”悬疑”) |
elastic search | 数组 | type=[“科幻”,”悬疑”] | type = “科幻” | type in (“科幻”,”悬疑”) |
solr | 数组 | type=[“科幻”,”悬疑”] | type = “科幻” | type in (“科幻”,”悬疑”) |
hive | 文本 | type=”科幻,悬疑” | ARRAY_CONTAINS(split(type, ‘/’), ‘科幻’) = true | 不支持 |
hive | 数组 | type=[“科幻”,”悬疑”] | ARRAY_CONTAINS(type, ‘科幻’) = true | 不支持 |
presto | 文本 | type=”科幻,悬疑” | CONTAINS(split(type, ‘/’), ‘科幻’) = true | 不支持 |
presto | 数组 | type=[“科幻”,”悬疑”] | CONTAINS(type, ‘科幻’) = true | 不支持 |
聚合
假定数据库只有一条记录 {id:1,type:[“科幻”,”悬疑”]}
- 此时 mongo 原生支持 unwind
select type, count(*) from mongo_table group by unwind(type) as type
返回: {“科幻”:1,”悬疑”:1}
- sybn jdbc driver 支持任意数据源模拟 unwind
-- 直接对 json 执行 unwind
select type, count(*) from [{id:1,type:["科幻","悬疑"]}] group by unwind(type) as type
返回: {“科幻”:1,”悬疑”:1}