第一题
搜索HyperLogLog算法相关内容,了解其原理,写出5条HyperLogLog的用途或大数据场景下的实际案例
概念
HyperLogLog是一种高级数据结构,是用来统计基数,也称为基数计数算法
基数计数(cardinality counting)是实际应用中一种常见的计算场景,在数据分析、网络监控及数据库优化等领域都有相关需求。精确的基数计数算法由于种种原因,在面对大数据场景时往往力不从心,因此如何在误差可控的情况下对基数进行估计就显得十分重要。目前常见的基数估计算法有Linear Counting、LogLog Counting、HyperLogLog Counting及Adaptive Counting等。这几种算法都是基于概率统计理论所设计的概率算法,它们克服了精确基数计数算法的诸多弊端(如内存需求过大或难以合并等),同时可以通过一定手段将误差控制在所要求的范围内
课上概括
考虑PV和UV的例子
近似去重,使用极少空间计算不重复数据个数
SQL的cardinality,count distinct,spark的approx_count_distinct
只能计算集合中有多少个不重复的元素,不能计算每个元素的出现次数或是判断一个元素是否之前出现过
原理:求每个值的hash,通过所有hash二进制的第一个1最晚出现的位置来估算不重复hash的个数(抛硬币,伯努利实验)
使用场景
基数大,数据量大
如果基数、数据量太小会造成空间浪费;其次只能统计基数数量,并不能知道数据的具体内容
1 统计当天注册用户
2 统计页面实时UV
3 统计在线人数
4 统计当天关键字的搜索总量
5 统计当天日志总量
第二题
在本地Docker环境或阿里云E-Mapreduce环境进行SQL查询, 要求在Presto中使用HyperLogLog计算近似基数(请自行创建表并插入若干数据)
环境搭建
https://www.alluxio.io/blog/getting-started-with-the-alluxio-presto-sandbox/
docker pull alluxio/alluxio-presto-sandbox
# 需要修改一下docker的内存分配
You’ll need to increase the default Docker VM settings if you’re running docker on MacOS.
Go to Docker > Preferences > Advanced > Memory and increase the slider to a minimum of 6GiB. It is recommended to give anywhere between 6.5GiB-8GiB
It is recommended to give 4 or more CPUs to the VM
docker run -d \
--shm-size 1G \
-p 19999:19999 \
-p 8080:8080 \
--name alluxio-presto-sandbox \
alluxio/alluxio-presto-sandbox
docker exec -it alluxio-presto-sandbox bash
presto --catalog hive --debug
案例
show catalogs;
show schemas in hive;
use hive.default;
CREATE TABLE test_hll2 (
a varchar,
hll varbinary
);
CREATE TABLE test_hll1 (
a varchar,
b varchar
);
show tables;
insert into test_hll1 values
('1','ABC'),
('2','DE'),
('1','AB'),
('2','CD'),
('1','EF'),
('2','GH'),
('1','AB'),
('2','LM'),
('3','CDE'),
('4','ABC');
insert into test_hll2 select a, cast(approx_set(b) as varbinary) from test_hll1 group by a;
select a, cardinality(merge(cast(hll as hyperloglog))) from test_hll2 group by a;
a | _col1
---+-------
2 | 4
4 | 1
3 | 1
1 | 3