前面我们介绍了doris的前缀索引。这里我们在介绍下doris提供的BloomFilter索引。这个BloomFilter索引不是像前缀索引那样是doris自带的,这个BloomFilter需要用户自己去创建。他的核心就是布隆过滤器,是一种hash算法,利用空间换时间的一种策略。
相信小伙伴在其他的场景里面也会涉及到这个布隆过滤器。布隆过滤器的特点是:
1、空间效率高的概率型数据结构,用来检查一个元素是否在一个集合中。 2、对于一个元素检测是否存在的调用,BloomFilter会告诉调用者两个结果之一:可能存在或者一定不存在。 3、缺点是存在误判,告诉你可能存在,不一定真实存在。
整个布隆过滤器实际上是由一个超长的二进制位数组和一系列的哈希函数组成。二进制位数组初始全部为0,当给定一个待查询的元素时,这个元素会被一系列哈希函数计算映射出一系列的值,所有的值在位数组的偏移量处置为1。如下图所示:
像上图所示,这里有一个18位长度的hash表,整个hash表里面初始值全是0,此时我们插入一些元素,那么布隆过滤器根据hash进行计算之后,会把对应的位置偏移量从0变为1,然后如果需要查询某个元素是否存在的时候,会计算相关位置偏移量,如果全是1,则代表当前数据存在,如果有0的存在,则代表当前数据不存在。(hash存在碰撞,所以需要满足所有的位都为1才代表数据存在。
最后备注下:
1、在doris中我们可以在任意列上创建BloomFilter索引
2、BloomFilter索引不适用范围查找,比较适合等于查找及in查找。
3、BloomFilter索引不能在下列的字段类型上使用:
1、Tinyint 2、Float 3、Double
以上3个类型的字段不能使用BloomFilter索引。
4、创建BloomFilter所以的示例如下:
CREATE TABLE IF NOT EXISTS sale_detail_bloom ( sale_date date NOT NULL COMMENT "销售时间", customer_id int NOT NULL COMMENT "客户编号", saler_id int NOT NULL COMMENT "销售员", sku_id int NOT NULL COMMENT "商品编号", category_id int NOT NULL COMMENT "商品分类", sale_count int NOT NULL COMMENT "销售数量", sale_price DECIMAL(12,2) NOT NULL COMMENT "单价", sale_amt DECIMAL(20,2) COMMENT "销售总金额" ) Duplicate KEY(sale_date, customer_id,saler_id,sku_id,category_id) PARTITION BY RANGE(sale_date) ( PARTITION P_202111 VALUES [('2021-11-01'), ('2021-12-01')) ) DISTRIBUTED BY HASH(saler_id) BUCKETS 10 PROPERTIES ( "replication_num" = "3", "bloom_filter_columns"="saler_id,category_id", "dynamic_partition.enable" = "true", "dynamic_partition.time_unit" = "MONTH", "dynamic_partition.time_zone" = "Asia/Shanghai", "dynamic_partition.start" = "-2147483648", "dynamic_partition.end" = "2", "dynamic_partition.prefix" = "P_", "dynamic_partition.replication_num" = "3", "dynamic_partition.buckets" = "3" );
即在创建的sql语句里面的properties属性里面添加bloom_filter_columns属性即可。
还没有评论,来说两句吧...