创建 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 。
布隆过滤器是一种空间高效的概率数据结构,用于测试某个元素是否为集合的成员。 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')
在上面的例子中,id
和 name
都是高基数(high cardinality)列,我们总是以精确的值查询 id
和 name
。因为 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 支持的属性
将数据加载到主表时,将为 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 数据映射进行数据管理与 Lucene 数据映射没有区别。您可以参考 DataMap ManagementCarbonData Lucene DataMap 中相应部分。