CarbonData Lucene DataMap (Alpha feature in 1.4.0)

DataMap 管理

Lucene DataMap 可以使用下面的 DDL 创建

CREATE DATAMAP [IF NOT EXISTS] datamap_name
ON TABLE main_table
USING 'lucene'
DMPROPERTIES ('index_columns'='city, name', ...)

DataMap 可以使用下面的 DDL 删除:

DROP DATAMAP [IF EXISTS] datamap_name
ON TABLE main_table

使用下面命令显示所有的 DataMaps:

SHOW DATAMAP
ON TABLE main_table

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

Lucene DataMap 介绍

Lucene 是一个高性能,全文搜索引擎。 Lucene 作为索引数据映射集成到 carbon中,并由 CarbonData 与主表一起管理。用户可以创建 lucene 数据映射来提高拥有大量字符的字符串列的查询性能。因此,用户可以通过 lucene 查询文本内容来搜索标记化的词(tokenized word)或模式(pattern)。

比如我们有一张名为 datamap_test 的表,定义如下:

CREATE TABLE datamap_test (
  name string,
  age int,
  city string,
  country string)
STORED BY 'carbondata'

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

CREATE DATAMAP dm
ON TABLE datamap_test
USING 'lucene'
DMPROPERTIES ('INDEX_COLUMNS' = 'name, country',)

DMProperties

  1. INDEX_COLUMNS: lucene 创建索引的字符串类型的列。
  2. FLUSH_CACHE: Lucene writer 维护的 cache 大小;如果指定,那么它会尝试聚合唯一数据直到缓存极限然后刷新到 Lucene。它特别适合低基数维度(low cardinality dimensions)。
  3. SPLIT_BLOCKLET: 当设置为 true 时,将数据以 blocklet 方式存储在 lucene 中,这意味着将为每个 blocklet 创建一个新文件夹,因此,可以避免在 lucene 中存储 blockletid,这使得 lucene 成为小块数据(it makes lucene small chunks of data)。

数据加载

将数据加载到主表时,将为 DMProperties 中 index_columns(String Columns) 配置的所有列生成 lucene 索引文件,其中包含有关 index_columns 数据位置的信息。 这些索引文件将被写入每个段文件夹内名为 datamap 名称的文件夹内。

可以添加系统级配置 carbon.lucene.compression.mode,以便对 lucene 索引文件进行最佳压缩。 默认值是 speed,这样索引写入的速度会更快。 如果该值为 compression,则索引文件将被压缩。

数据查询

作为查询加速技术,Lucene 索引不能直接被查询,查询将在主表上进行。当使用 TEXT_MATCH('name:c10')TEXT_MATCH_WITH_LIMIT('name:n10',10)[第二个参数表示要返回的结果数时,如果用户未指定此值,则将返回所有结果] 查询时,将有两个作业被触发。第一个作业将包含 lucene 的搜索结果写入以表级别创建的文件夹中的临时文件里面,这些文件将在第二个作业中读取以提供更快的查询结果。一旦查询完成,这些临时文件将被清除。

用户可以通过执行 EXPLAIN 命令来验证查询是否利用 Lucene 数据映射,该命令将显示已转换的逻辑计划。因此用户可以检查 TEXT_MATCH() 过滤器是否被应用于查询。

注意:

  1. TEXT_MATCHTEXT_MATCH_WITH_LIMIT 中的过滤列必须始终为小写,过滤条件如 'AND','OR' 必须大写。

    比如:

    select * from datamap_test where TEXT_MATCH('name:*10 AND name:*n*')
    
  2. 查询仅支持一个 TEXT_MATCH udf 作为过滤条件,而不支持多个 udfs。

    下面的查询是支持的:

    select * from datamap_test where TEXT_MATCH('name:*10 AND name:*n*')
    

    下面的查询是不支持的:

    select * from datamap_test where TEXT_MATCH('name:*10) AND TEXT_MATCH(name:*n*')
    

下面的查询可以转换为 text_match 查询,如下所示::

select * from datamap_test where name='n10'

select * from datamap_test where name like 'n1%'

select * from datamap_test where name like '%10'

select * from datamap_test where name like '%n%'

select * from datamap_test where name like '%10' and name not like '%n%'

Lucene TEXT_MATCH 查询:

select * from datamap_test where TEXT_MATCH('name:n10')

select * from datamap_test where TEXT_MATCH('name:n1*')

select * from datamap_test where TEXT_MATCH('name:*10')

select * from datamap_test where TEXT_MATCH('name:*n*')

select * from datamap_test where TEXT_MATCH('name:*10 -name:*n*')

注意: lucene 查询和语法, 请参见 lucene-syntax

lucene datamap 数据管理

一旦在主表上创建了 lucene 数据映射,就不支持在主表上执行以下命令:

  1. 数据管理命令: UPDATE/DELETE.
  2. 模式管理命令: ALTER TABLE DROP COLUMN, ALTER TABLE CHANGE DATATYPE, ALTER TABLE RENAME.

注意: 支持添加新列,并且为了删除列和更改数据类型命令,CarbonData 将检查它是否会影响 lucene 数据映射;如果不影响,则允许操作,否则操作将被拒绝并抛出异常。

  1. 分区管理命令: ALTER TABLE ADD/DROP PARTITION.

但是,仍然有办法在主表上执行这些操作,在当前 CarbonData 版本中,用户可以执行如下操作::

  1. 通过 DROP DATAMAP 命令删除 lucene datamap。
  2. 在主表上执行数据管理操作
  3. 通过 CREATE DATAMAP 命令创建 lucene datamap。基本上,用户可以手动触发来重新构建 datamap。