近似计算在Presto的使用

HyperLogLog是一种高效的数据结构,用于近似基数计数,尤其适用于大数据场景。它通过概率统计方法在有限空间内估算不重复元素的数量,常用于统计注册用户、页面UV、在线人数、搜索关键字总量和日志计数等。在Presto中,可以使用HyperLogLog进行SQL查询,实现近似基数的计算,例如在示例中展示了如何创建表、插入数据并进行基数估算。
摘要由CSDN通过智能技术生成

第一题

搜索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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值