CarbonData BloomFilter DataMap (Alpha feature in 1.4.0)

DataMap 管理

创建 BloomFilter DataMap

CREATE DATAMAP [IF NOT EXISTS] datamap_name
ON TABLE main_table
USING 'bloomfilter'
DMPROPERTIES ('index_columns'='city, name', 'BLOOM_SIZE'='640000', 'BLOOM_FPP'='0.00001')

删除指定的 datamap

DROP DATAMAP [IF EXISTS] datamap_name
ON TABLE main_table

显示指定表的所有 DataMaps

SHOW DATAMAP
ON TABLE main_table

上面命令将会显示所有创建在 main_table 上的所有 DataMaps 。

BloomFilter DataMap 介绍

布隆过滤器是一种空间高效的概率数据结构,用于测试某个元素是否为集合的成员。 Carbondata将BloomFilter作为索引 datamap 来提高查询的准确性。 它非常适合在高基数列(如名称/ID)上进行精确匹配的查询。 在内部,CarbonData为每个 blocklet 中的每个索引列维护 BloomFilter,以指示该列的值是否在此块中。 和其他 datamaps 一样,BloomFilter datamap 也是由 CarbonData 的主表管理。 用户可以使用指定的 BloomFilter 配置(如大小和概率)在指定列上创建 BloomFilter datamap。

比如,名为 datamap_test 的主表定义如下:

CREATE TABLE datamap_test (
  id string,
  name string,
  age int,
  city string,
  country string)
STORED BY 'carbondata'
TBLPROPERTIES('SORT_COLUMNS'='id')
在上面的例子中,idname 都是高基数(high cardinality)列,我们总是以精确的值查询 idname 。因为 id 在 sort_columns 里面配置了,所以其已经排序了,在其上进行查询就会很快,因为 CarbonData 可以跳过所有不相关的块(blocklets)。但是对 name 的查询可能不好,因为 blocklet 的 minmax 可能没有帮助,因为在每个 blocklet 中 name 值的范围可能是相同的 -- 全部来自A~z。在这种情况下,用户可以在 name 列上创建 BloomFilter datamap。 此外,用户还可以在 sort_columns 上创建 BloomFilter datamap。 如果我们有太多的段并且 sort_columns 的值范围几乎相同的情况下很有用。

用户可以使用 Create DataMap DDL 来创建 BloomFilter datamap:

CREATE DATAMAP dm
ON TABLE datamap_test
USING 'bloomfilter'
DMPROPERTIES ('INDEX_COLUMNS' = 'name,id', 'BLOOM_SIZE'='640000', 'BLOOM_FPP'='0.00001', 'BLOOM_COMPRESS'='true')

BloomFilter DataMap 支持的属性

属性 是否必须 默认值 描述
INDEX_COLUMNS YES Carbondata 将在这些列上生成 BloomFilter 索引。在这些列上的查询通常像 'COL = VAL'。
BLOOM_SIZE NO 32000 该值由 BloomFilter 内部使用用于预期插入的数量,它将影响 BloomFilter 索引的大小。由于每个 blocklet 都有一个 BloomFilter,所以该值是 blocklet 中记录近似的个数。 换句话说,应该是 32000 * #noOfPagesInBlocklet。该值应该是一个整数。
BLOOM_FPP NO 0.01 该值在 BloomFilter 内部被用作为假阳性概率(False-Positive Probability),它将影响 bloomfilter 索引的大小以及 BloomFilter 的哈希函数的数量。该值的范围应该在 (0, 1) 之间。
BLOOM_COMPRESS NO true 是否压缩 BloomFilter 索引文件。

数据加载

将数据加载到主表时,将为 DMProperties 中所有 index_columns 生成 BloomFilter 文件,其中包含 blockletId 和每个索引列的 BloomFilter。 这些索引文件将被写入每个段文件夹内名为 datamap 名称的文件夹内。

数据查询

可通过系统级配置 carbon.query.datamap.bloom.cache.size 为 bloomfilter 索引文件提供缓存来增强 BloomFilter 数据映射的查询性能。这个属性的默认值是 512,单位是 MB。 在内部,缓存将在闲置 2 小时后过期。

用户可以通过执行 EXPLAIN 命令来验证查询是否利用 BloomFilter 数据映射,该命令将显示已转换的逻辑计划,用户从而可以检查 BloomFilter 数据映射是否可以在扫描期间跳过数据块(blocklets)。如果数据映射不能很好地修剪小块,则可以尝试增加 BLOOM_SIZE 属性的值并减小 BLOOM_FPP 属性的值。

BloomFilter DataMap 的数据管理

使用 BloomFilter 数据映射进行数据管理与 Lucene 数据映射没有区别。您可以参考 DataMap ManagementCarbonData Lucene DataMap 中相应部分。