SparkSQL & ClickHouse RoaringBitmap使用实践

文章目录

  • 简介
    • ClickHouse简介
    • RoaringBitmap(RBM)原理
    • ClickHouse中使用RBM存在的问题
  • RoaringBitmap(RBM)定制序列化实现
    • ClickHouse中RoaringBitmap的结构解析
    • Spark中RoaringBitmap的实现
    • 定制RBM序列化方式以兼容ClickHouse
      • Byte(1) - 类型标识生成
      • VarInt(SerializedSizeInBytes) - 序列化后的字节长度
      • ByteArray(RoaringBitmap) - RBM序列化
      • 定制序列化的整体实现
      • Spark和ClickHouse生成的RBM序列化数据比对
        • ClickHouse中生成的RBM数据:
        • Spark中定制生成的RBM数据:
  • Spark生成RBM导入ClickHouse实现
    • 创建ClickHouse表
    • 使用Spark JDBC方式导入
    • 查询CK表中数据验证
  • 64位RoaringBitmap(RBM)定制序列化实现

简介

ClickHouse简介

ClickHouse是由号称“俄罗斯Google”的Yandex公司开发并在2016年开源。ClickHouse是一个列存储数据库,是原生的向量化执行引擎。目前ClickHouse在OLAP领域得到了广泛的使用,其首要原因是查询速度快。

在大数据处理中,海量数据的判重和基数统计是两个绕不开的基础问题。ClickHouse的解决方案是使用RoaringBitmap,其已有丰富的bitmap操作函数支持,可以实现非常灵活方便的判重和基数统计操作。

RoaringBitmap(RBM)原理

Bitmap用位图的方式来存储id数值信息,可以实现精确地基数统计。但因为Bitmap在数值稀疏时会造成很大空间浪费,因此提出了用RoaringBitmap(RBM)对稀疏位图进行压缩,减少内存占用并提高效率。RBM的主要思路是:将32位无符号整数按照高16位分桶,即最多可能有2^16=65536个桶,又称为container。存储数据时,按照数据的高16位找到container(找不到就会新建一个),再将低16位放入container中。也就是说,一个RBM就是很多container的集合。其详细的原理可参考文章。

ClickHouse中使用RBM存在的问题

在查看了ClickHouse的文档及搜索了各公司的实践方案(如腾讯和头条)后,发现目前只能将原始明细的id数据导入到ClickHouse后,再通过创建物化视图的方式构建RBM结构进行使用。但是原始明细数据量往往非常大,这不仅给数据ETL处理造成了很大的负担

你可能感兴趣的:(spark,spark,clickhouse,roaringbitmap,bitmap,uv)