我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Distinct Count的Bitmap怎么做排序

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Distinct Count的Bitmap怎么做排序

本篇内容主要讲解“Distinct Count的Bitmap怎么做排序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Distinct Count的Bitmap怎么做排序”吧!

大数据(big data),IT行业术语,是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

1. Bitmap介绍

Bitmap是一个十分有用的数据结构。所谓的Bitmap就是用一个bit位来标记某个元素对应的Value,而Key即是该元素。由于采用了Bit为单位来存储数据,因此在内存占用方面,可以大大节省。

简而言之——用一个bit(0或1)表示某元素是否出现过,其在bitmap的位置对应于其index。

用bitmap做排序的例子:

#include#define BITSPERWORD 32#define SHIFT 5#define MASK 0x1F#define N 10000000int a[1 + N / BITSPERWORD];void set(int i) { a[i >> SHIFT] |= (1 << (i & MASK)); }void clr(int i) { a[i >> SHIFT] &= ~(1 << (i & MASK)); }int test(int i) { return a[i >> SHIFT] & (1 << (i & MASK)); }int main() {    int i;    for (i = 0; i < N; i++)        clr(i);        while (scanf("%d", &i) != EOF)        set(i);    for (i = 0; i < N; i++)        if (test(i))            printf("%d\n", i);    return 0;}

上面代码中,用int的数组存储bitmap,对于每一个待排序的int数,其对应的index为其int值。

2. Distinct Count优化

index生成

为了使用bitmap做Distinct Count,首先需得到每个用户(uid)对应(在bitmap中)的index。有两种办法可以得到从1开始编号index表(与uid一一对应):

  • hash,但是要找到无碰撞且hash值均匀分布[1, +∞)区间的hash函数是非常困难的;

  • 维护一张uid与index之间的映射表,并增量更新

  • 比较两种方法,第二种方法更为简单可行。

    UV计算

    在index生成完成后,RDD[(uid, V)]与RDD[(uid, index)]join得到index化的RDD。bitmap的开源实现有EWAH,采用RLE(Run Length Encoding)压缩,很好地解决了存储空间的浪费。Distinct Count计算转变成了求bitmap中1的个数:

    // distinct count for rdd(not pair) and the rdd must be sorted in each partitiondef distinctCount(rdd: RDD[Int]): Int = {    val bitmap = rdd.aggregate[EWAHCompressedBitmap](new EWAHCompressedBitmap())(      (u: EWAHCompressedBitmap, v: Int) => {        u.set(v)        u      },      (u1: EWAHCompressedBitmap, u2: EWAHCompressedBitmap) => u1.or(u2)    )    bitmap.cardinality()}// the tuple_2 is the indexdef groupCount[K: ClassTag](rdd: RDD[(K, Int)]): RDD[(K, Int)] = {    val grouped: RDD[(K, EWAHCompressedBitmap)] = rdd.combineByKey[EWAHCompressedBitmap](      (v: Int) => EWAHCompressedBitmap.bitmapOf(v),      (c: EWAHCompressedBitmap, v: Int) => {        c.set(v)        c      },      (c1: EWAHCompressedBitmap, c2: EWAHCompressedBitmap) => c1.or(c2))    grouped.map(t => (t._1, t._2.cardinality()))}

    但是,在上述计算中,由于EWAHCompressedBitmap的set方法要求int值是升序的,也就是说RDD的每一个partition的index应是升序排列:

    // sort pair RDD by valuedef sortPairRDD[K](rdd: RDD[(K, Int)]): RDD[(K, Int)] = {    rdd.mapPartitions(iter => {      iter.toArray.sortWith((x, y) => x._2.compare(y._2) < 0).iterator    })}

    为了避免排序,可以为每一个uid生成一个bitmap,然后在Distinct Count时将bitmap进行or运算亦可:

    rdd.reduceByKey(_ or _)    .mapValues(_._2.cardinality())

到此,相信大家对“Distinct Count的Bitmap怎么做排序”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Distinct Count的Bitmap怎么做排序

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Distinct Count的Bitmap怎么做排序

本篇内容主要讲解“Distinct Count的Bitmap怎么做排序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Distinct Count的Bitmap怎么做排序”吧!大数据(big da
2023-06-02

拓扑排序是怎么排序的

这篇文章主要讲解了“拓扑排序是怎么排序的”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“拓扑排序是怎么排序的”吧!方法:1、找到图中的一个入度为0的结点,将此节点从图中剔除并加入到序列E中;2
2023-06-20

Java的堆排序、快速排序、归并排序怎么实现

本文小编为大家详细介绍“Java的堆排序、快速排序、归并排序怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java的堆排序、快速排序、归并排序怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。堆排序
2023-06-26

Java桶排序的基数排序怎么理解

这篇文章主要介绍“Java桶排序的基数排序怎么理解”,在日常操作中,相信很多人在Java桶排序的基数排序怎么理解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java桶排序的基数排序怎么理解”的疑惑有所帮助!
2023-06-21

oracle decode怎么排序的

oracle decode 函数用于基于条件将表达式转换为指定值,在排序 decode 结果时,oracle 遵循以下规则:case when 语句排序根据 when 条件的顺序。其他表达式排序根据表达式本身。null 值被视为最小值。缺失
oracle decode怎么排序的
2024-05-30

oracle中的倒序怎么排

在 oracle 中,可以通过 order by 子句实现倒序排序:使用 order by column_name desc 语法,其中 column_name 是要排序的列名。例如:select first_name, last_name
oracle中的倒序怎么排
2024-05-03

sql中从大到小排序怎么排的

在 sql 中,可以通过使用 desc 关键字进行从大到小排序。示例:select amount from sales order by amount desc;SQL 中从大到小排序在 SQL 中,可以使用 DESC 关键字来对数据进行
sql中从大到小排序怎么排的
2024-05-15

Redis有序集合是怎么实现排序的

Redis有序集合是通过使用有序集合中的分数(score)来实现排序的。在有序集合中,每个成员都会关联一个分数,可以通过这个分数来对成员进行排序。当向有序集合中插入新成员时,可以指定成员的分数,Redis会根据指定的分数对成员进行排序,使得
Redis有序集合是怎么实现排序的
2024-05-07

php怎么实现常见的排序

这篇文章给大家分享的是有关php怎么实现常见的排序的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体内容如下$arr = [4,5,3,2,1,9,8,6,7];冒泡排序function maopao($arr)
2023-06-15

SQL怎么按某个字段值的顺序排序

在SQL中,可以使用ORDER BY子句按照某个字段的值的顺序对查询结果进行排序。ORDER BY子句可以使用在SELECT语句的末尾。以下是一个示例,演示如何按照一个名为"field_name"的字段值的顺序对查询结果进行排序:SEL
SQL怎么按某个字段值的顺序排序
2024-04-09

Java排序算法之怎么实现快速排序的三数取中法

这篇文章主要讲解了“Java排序算法之怎么实现快速排序的三数取中法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java排序算法之怎么实现快速排序的三数取中法”吧!基本步骤三数取中在快排的过
2023-06-25

mybatis怎么实现数据库的排序

这篇文章主要介绍“mybatis怎么实现数据库的排序”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“mybatis怎么实现数据库的排序”文章能帮助大家解决问题。mybatis数据库排序今天用到了对数据
2023-06-29

java自动排序的集合怎么写

Java中有多种自动排序的集合类可以使用,其中最常用的是TreeSet和TreeMap。TreeSet是一个有序的集合,它根据元素的自然顺序进行排序。如果希望使用自定义的顺序来进行排序,可以在创建TreeSet对象时传入一个Compara
java自动排序的集合怎么写
2024-02-29

mysql怎么查看表的排序规则

要查看 MySQL 表的排序规则,可以通过查询表的元数据信息来获取。你可以使用以下 SQL 查询语句来查看表的排序规则:SHOW TABLE STATUS LIKE table_name;在上面的语句中,将 table_name 替换为你
mysql怎么查看表的排序规则
2024-03-02

怎么修改sql表的排序规则

要修改SQL表的排序规则,可以使用ALTER TABLE语句以及COLLATE子句。以下是一些示例:修改表的默认排序规则:ALTER TABLE 表名DEFAULT CHARACTER SET 字符集名称COLLATE 排序规则名称;修
怎么修改sql表的排序规则
2024-04-09

python怎么降序排列列表的值

使用 python 降序排列列表的值:1. 使用 sort() 函数并传入 reverse=true 参数。2. 使用 reversed() 函数返回反向迭代器。3. 使用切片操作 my_list[::-1]。4. 使用 max() 和 m
python怎么降序排列列表的值
2024-05-14

utf8mb4常用的排序方式怎么选

含义 MySQL常用排序规则: utf8mb4_general_ciutf8mb4_unicode_ciutf8mb4_bin ci:即case insensitive,不区分大小写。 utf8mb4_unicode_ci: 是基于标准的U
2023-08-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录