大数据下的Distinct Count(一):序

本文介绍在大数据场景下,使用Hive、Pig、Spark等工具进行UV(Unique Visitor)统计的方法,包括精确计数和近似计数算法,如HyperLogLog++和Spark的countApproxDistinctByKey。
大数据(big data),IT行业术语,是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

大数据下的Distinct Count(一):序大数据下的Distinct Count(一):序

Hive

在大数据场景下,报表很重要一项是UV(Unique Visitor)统计,即某时间段内用户人数。例如,查看一周内app的用户分布情况,Hive中写HiveQL实现:

select app, count(distinct uid) as uv
from log_table
where week_cal = '2016-03-27'

Pig

与之类似,Pig的写法:

-- all users
define DISTINCT_COUNT(A, a) returns dist {
    B = foreach $A generate $a;
    unique_B = distinct B;
    C = group unique_B all;
    $dist = foreach C generate SIZE(unique_B);
}
A = load '/path/to/data' using PigStorage() as (app, uid);
B = DISTINCT_COUNT(A, uid);

-- 
A = load '/path/to/data' using PigStorage() as (app, uid);
B = distinct A;
C = group B by app;
D = foreach C generate group as app, COUNT($1) as uv;
-- suitable for small cardinality scenarios
D = foreach C generate group as app, SIZE($1) as uv;

DataFu 为pig提供基数估计的UDF datafu.pig.stats.HyperLogLogPlusPlus,其采用HyperLogLog++算法,更为快速地Distinct Count:

define HyperLogLogPlusPlus datafu.pig.stats.HyperLogLogPlusPlus();
A = load '/path/to/data' using PigStorage() as (app, uid);
B = group A by app;
C = foreach B generate group as app, HyperLogLogPlusPlus($1) as uv;

Spark

在Spark中,Load数据后通过RDD一系列的转换——map、distinct、reduceByKey进行Distinct Count:

rdd.map { row => (row.app, row.uid) }
  .distinct()
  .map { line => (line._1, 1) }
  .reduceByKey(_ + _)

// or
rdd.map { row => (row.app, row.uid) }
  .distinct()
  .mapValues{ _ => 1 }
  .reduceByKey(_ + _)

// or 
rdd.map { row => (row.app, row.uid) }
  .distinct()
  .map(_._1)
  .countByValue()

同时,Spark提供近似Distinct Count的API:

rdd.map { row => (row.app, row.uid) }
    .countApproxDistinctByKey(0.001)

实现是基于HyperLogLog算法:

The algorithm used is based on streamlib's implementation of "HyperLogLog in Practice: Algorithmic Engineering of a State of The Art Cardinality Estimation Algorithm", available here.

或者,将Schema化的RDD转成DataFrame后,registerTempTable然后执行sql命令亦可:

val sqlContext = new SQLContext(sc)
val df = rdd.toDF()
df.registerTempTable("app_table")

val appUsers = sqlContext.sql("select app, count(distinct uid) as uv from app_table group by app")

本文地址:https://www.linuxprobe.com/big-data-sequence.html

OpenCV(开源计算机视觉库)是个强大的图像处理和计算机视觉工具包,被广泛应用于各种领域,包括图像分析、机器学习和人工智能。MFC(Microsoft Foundation Classes)是微软提供的套面向对象的C++库,用于构建Windows应用程。在这个项目中,我们将OpenCV与MFC结合,利用MFC中的CRectTracker类实现用户交互式地选择图像ROI(感兴趣区域)并创建模板图像。CRectTracker类是MFC中的个实用工具,它允许用户通过拖动鼠标在窗口上画出个矩形区域,就像橡皮筋样。这个类提供了跟踪矩形边角的能力,使得用户可以方便地调整矩形的大小和位置。在OpenCV中,我们需要这种交互性来让用户指定他们感兴趣的图像区域,这通常是用于匹配、识别或其他特定分析任务。在实现过程中,你需要在MFC应用中集成OpenCV库,创建个窗口控件显示图像。然后,你可以为该控件添加消息处理函数,监听WM_LBUTTONDOWN、WM_LBUTTONUP和WM_MOUSEMOVE消息,这些消息分别对应于鼠标的左键按下、释放和移动事件。当用户在图像上点击并拖动时,CRectTracker会跟踪这个矩形区域,并更新其位置和大小。旦用户完成选择,你可以获取CRectTracker实例中的矩形坐标,并将其映射到原始图像的像素坐标。OpenCV提供了`cv::Rect`类来表示图像上的矩形区域,你可以创建个`cv::Rect`对象来保存用户选择的ROI。然后,你可以使用这个矩形区域从原始图像中裁剪出个新的图像,这就是模板图像。模板图像在计算机视觉中有多种用途,例如模板匹配。在OpenCV中,可以使用`cv::matchTemplate`函数进行模板匹配,它会计算模板图像和目标图像之间的相似度,返回个匹配结果图,高亮显示出与模板最匹配的区域。为了提高用户体验,你可能还需要考虑些额外的功能,如实时预览选定的ROI,或者提供撤销/重做操作。此外,确保正确处理边界情况,比如用户选择的矩形区域超出图像边界。这个项目结合了OpenCV的强大图像处理功能和MFC的用户界面优点,实现了用户友好的图像ROI选择。通过CRectTracker类,我们可以创建个交互式的图形界面,允许用户自由地选择感兴趣的图像区域,进而生成模板图像,这对于许多计算机视觉应用来说是非常有用的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值