如何在 1s 内统计出 13 亿人口数据找出使用人数最多的十个姓名

2021-01-25 10:32:21 +08:00
 cage111

请教下各位大佬这种需求可以实现吗

13364 次点击
所在节点    数据库
104 条回复
cage111
2021-01-25 11:26:45 +08:00
@iceecream 刚搜了下,es 的 group by 在多 shard 下好像是不精确的
EthanDon
2021-01-25 11:30:22 +08:00
直觉上 clickhouse
jzmws
2021-01-25 11:31:20 +08:00
预处理 然后丢到内存上?
Mohanson
2021-01-25 11:32:10 +08:00
字典树啊字典树!

1 秒是什么概念? 一微秒就够了.
Mithril
2021-01-25 11:34:31 +08:00
直接弄个计数器,录入数据的时候直接算好了不就完了。。。
这玩意真的有实时计算的必要吗?
shyling
2021-01-25 11:37:05 +08:00
提前算好 topN 不就好啦
cage111
2021-01-25 11:41:08 +08:00
@EthanDon clickhouse 试了 1 亿时间 group 要 5,6 秒了
ppbaozi
2021-01-25 11:41:13 +08:00
数据哪来的
tanszhe
2021-01-25 11:41:19 +08:00
clickhouse 1 核 2G, 估计都可以 1s 内出结果
tanszhe
2021-01-25 11:42:06 +08:00
@cage111 你的表结构和 sql 语句看看
rihkddd
2021-01-25 11:44:04 +08:00
@Mohanson 终于有人说字典树了,传统数据结构还是还高效的。可以做一些简单优化,比如定一个远低于 top10 的词频的阈值,去掉长尾数据,放到内存根本都不要 1 个 G 。
各种查询调节,分别建立对应的字典树。可以满足实时性和准确性。
rihkddd
2021-01-25 11:45:16 +08:00
@rihkddd 感觉加上阈值优化,都不需要字典树,直接 hashmap 都没问题。
PiersSoCool
2021-01-25 11:49:35 +08:00
1s 基本忽略集群了 什么集群处理能有这么快 操作都要 prepare task 那先排除大数据方案
你要说这个数据在内存里 那就先建立最大堆 O1
你要说不在内存里 13e 的姓名 恐怕 1s 都加不到内存里
这个问题有点扯淡。。。
polymerdg
2021-01-25 11:50:45 +08:00
公安部大佬?
cage111
2021-01-25 11:51:38 +08:00
@tanszhe
CREATE TABLE china.base_person_info
(
`id` String,
`birthday` Nullable(String),
`location` Nullable(String),
`name` Nullable(String),
`type` Nullable(String),
`category` Nullable(String),
)
ENGINE = MergeTree
ORDER BY id
SETTINGS index_granularity = 8192

查询语句
select name,count(*) from group by name limit 10,1
又加了点数据报错了...
Code: 241, e.displayText() = DB::Exception: Memory limit (for query) exceeded: would use 9.32 GiB (attempt to allocate chunk of 4718592 bytes), maximum: 9.31 GiB: While executing AggregatingTransform (version 20.5.2.7 (official build))
cage111
2021-01-25 11:54:23 +08:00
@polymerdg 不是,可以把姓名理解成商品,随便举例的,类似给运营人员用的爆款商品分析
yolee599
2021-01-25 11:55:27 +08:00
建树状服务器群集,把任务分下去,像比赛晋级一样一层一层往上传递结果,最高层就是最终结果。
cage111
2021-01-25 11:55:29 +08:00
@ppbaozi 姓名只是举例,怕暴露产品信息
wyfyw
2021-01-25 12:01:21 +08:00
如果你只关心"xxx 使用人数最多的十个姓名"字典树绝对可以帮你解决。

简化为 100 个姓,最长三 /四个字的名字,使用常用汉字 3500 。如果最长三字的名字,空间才 100*3500*3500

忽略其它姓氏、生僻汉字、更长的名字(?这点存疑,少数民族地区未必适用),因为满足任何一条的名字不可能人数最多。
silentsee
2021-01-25 12:04:08 +08:00
@cage111 order by name 才有索引

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/748059

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX