正交的BITMAP计算

    解决思路是将bitmap列的值按照range划分,不同range的值存储在不同的分桶中,保证了不同分桶的bitmap值是正交的。当查询时,先分别对不同分桶中的正交bitmap进行聚合计算,然后顶层节点直接将聚合计算后的值合并汇总,并输出。如此会大大提高计算效率,解决了顶层单节点计算瓶颈问题。

    使用指南

    1. 使用场景

    建表时需要使用聚合模型,数据类型是 bitmap , 聚合函数是 bitmap_union

    表schema增加hid列,表示id范围, 作为hash分桶列。

    注:hid数和BUCKETS要设置合理,hid数设置至少是BUCKETS的5倍以上,以使数据hash分桶尽量均衡

    1. (
    2. DATA INFILE('hdfs://abc')
    3. INTO TABLE user_tag_bitmap
    4. COLUMNS TERMINATED BY ','
    5. SET (
    6. hid = ceil(tmp_user_id/5000000),
    7. user_id = to_bitmap(tmp_user_id)
    8. )
    9. 注意:5000000这个数不固定,可按需调整
    10. ...

    数据格式:

    注:第一列代表用户标签,由中文转换成数字

    load数据时,对用户bitmap值range范围纵向切割,例如,用户id在1-5000000范围内的hid值相同,hid值相同的行会分配到一个分桶内,如此每个分桶内到的bitmap都是正交的。可以利用桶内bitmap值正交特性,进行交并集计算,计算结果会被shuffle至top节点聚合。

    bitmap_orthogonal_intersect

    求bitmap交集函数

    语法:

    orthogonal_bitmap_intersect(bitmap_column, column_to_filter, filter_values)

    第一个参数是Bitmap列,第二个参数是用来过滤的维度列,第三个参数是变长参数,含义是过滤维度列的不同取值

    说明:

    查询规划上聚合分2层,在第一层be节点(update、serialize)先按filter_values为key进行hash聚合,然后对所有key的bitmap求交集,结果序列化后发送至第二层be节点(merge、finalize),在第二层be节点对所有来源于第一层节点的bitmap值循环求并集

    样例:

    1. select BITMAP_COUNT(orthogonal_bitmap_intersect(user_id, tag, 13080800, 11110200)) from user_tag_bitmap where tag in (13080800, 11110200);

    orthogonal_bitmap_intersect_count

    求bitmap交集count函数,语法同原版intersect_count,但实现不同

    语法:

    orthogonal_bitmap_intersect_count(bitmap_column, column_to_filter, filter_values)

    参数:

    第一个参数是Bitmap列,第二个参数是用来过滤的维度列,第三个参数开始是变长参数,含义是过滤维度列的不同取值

    说明:

    orthogonal_bitmap_union_count

    求bitmap并集count函数,语法同原版bitmap_union_count,但实现不同。

    语法:

    orthogonal_bitmap_union_count(bitmap_column)

    参数:

    参数类型是bitmap,是待求并集count的列

    说明:

    查询规划上分2层,在第一层be节点(update、serialize)对所有bitmap求并集,再对并集的结果bitmap求count,count值序列化后发送至第二层be节点(merge、finalize),在第二层be节点对所有来源于第一层节点的count值循环求sum

    符合对bitmap进行正交计算的场景,如在用户行为分析中,计算留存,漏斗,用户画像等。

    人群圈选:

    计算user_id的去重值: