CarbonDataDDL翻译003

 

CarbonData数据定义语言

创建表

这条命令可以用来创建一个CarbonData表,指定字段列表和表的属性。你还可以指定需要存储表的位置。

CREATE TABLE [IF NOT EXISTS] [db_name.]table_name[(col_name data_type , ...)]

STORED AS carbondata

[TBLPROPERTIES (property_name=property_value, ...)]

[LOCATION 'path']

 

注意:CarbonData也支持 "STORED AS carbondata "和 "USING carbondata"。在CarbonData repo中的CarbonSessionExample中可以找到示例代码。

使用指南

支持的属性。

属性

描述

NO_INVERTED_INDEX

从倒置的索引生成中排除的列

INVERTED_INDEX

倒置索引生成时要包括的列

SORT_COLUMNS

在排序中包括的列和它的排序顺序

SORT_SCOPE

负载的排序范围。选项包括无排序、本地排序、批量排序和全局排序。

TABLE_BLOCKSIZE

写入hdfs的块的大小

TABLE_BLOCKLET_SIZE

要写入文件中的小块大小

TABLE_PAGE_SIZE_INMB

页面大小,以MB为单位;如果页面大小在32000行之前超过这个值,页面将被切割成这么多行,剩余的行将在后续页面中处理。这有助于保持页面大小适合于cpu缓存的大小。

MAJOR_COMPACTION_SIZE

可以合并成一个段的大小

AUTO_LOAD_MERGE

是否自动压缩分段

COMPACTION_LEVEL_THRESHOLD

要压缩成一个段的数量

COMPACTION_PRESERVE_SEGMENTS

需要从压实中排除的最新片段的数量

ALLOWED_COMPACTION_DAYS

在配置的时间限制内生成的片段将被压缩,跳过其他片段。

STREAMING

该表是否是一个流式表

LOCAL_DICTIONARY_ENABLE

启用本地词典的生成

LOCAL_DICTIONARY_THRESHOLD

可以生成本地字典的cardinality。

LOCAL_DICTIONARY_INCLUDE

需要生成本地字典的列。当不需要为所有字符串/varchar/char列生成本地字典时,非常有用。

LOCAL_DICTIONARY_EXCLUDE

应该跳过生成本地字典的列。当不需要为少数字符串/varchar/char列生成本地字典时很有用。

COLUMN_META_CACHE

可以在Driver中缓存元数据的列,以便有效修剪和提高查询性能

CACHE_LEVEL

列元数据缓存级别。是否缓存区块或小区块的列元数据

FLAT_FOLDER

是否在一个文件夹中写入所有的carbondata文件.在增量加载时不写入分段文件夹

LONG_STRING_COLUMNS

大于32K字符的列

BUCKET_NUMBER

要创建的桶的数量

BUCKET_COLUMNS

将被置于桶中的柱子

LOAD_MIN_SIZE_INMB

每个节点的最小输入数据大小,用于数据加载

Range Column

按范围划分输入数据

INDEX_CACHE_EXPIRATION_TIME_IN_SECONDS

基于时间的表级缓存过期时间,单位为秒

以下是TBLPROPERTIES的准则,CarbonData的附加表选项可以通过carbon.properties来设置。

本地字典配置

没有生成字典的列需要更多的存储空间,反过来也需要更多的IO。另外,由于在查询过程中需要读取更多的数据,查询性能也会受到影响。为这些列的每个区块生成字典将有助于节省存储空间,并有助于提高查询性能,因为Carbondata为更有效地处理字典编码的列做了优化。请参考Carbondata的文件结构,以了解carbondata的文件结构以及blocklet等术语的含义。

当地的字典有助于在。

1. 获得更多的压缩。

2. 过滤查询和全面扫描查询将更快,因为过滤将在编码数据上完成。

3. 减少存储大小和内存占用,因为只有唯一的值将被存储为本地字典的一部分,相应的数据将被存储为编码数据。

4. 获得更高的IO吞吐量。

注意:

本地字典支持以下数据类型。

o STRING

o VARCHAR

o CHAR

以下数据类型不支持本地字典。

o SMALLINT

o INTEGER

o BIGINT

o DOUBLE

o DECIMAL

o TIMESTAMP

o DATE

o BOOLEAN

o FLOAT

o BYTE

o Binary

在多级复杂的dataType列的情况下,原始的字符串/varchar/char列被考虑用于生成本地字典。

本地字典的系统级属性。

属性

默认值

描述

carbon.local.dictionary.enable

默认情况下,Carbondata表的本地字典将被启用。

carbon.local.dictionary.decoder.fallback

页面级别的数据将不会被保留给小块。在回退过程中,实际数据将使用本地字典从编码的页面数据中检索出来。注意:与此属性设置为false时相比,内存占用明显减少。

在创建表的命令中,可以使用以下属性来配置本地字典。

属性

默认值

描述

LOCAL_DICTIONARY_ENABLE

FALSE

是否启用本地字典的生成。注意:如果定义了这个属性,它将覆盖在系统层面上通过'carbon.local.dictionary.enable'配置的值。除非配置了LOCAL_DICTIONARY_INCLUDE, LOCAL_DICTIONARY_EXCLUDE,否则将为所有字符串/varchar/字符列生成本地字典。

LOCAL_DICTIONARY_THRESHOLD

10000

一个列的最大cardinality,carbondata可以尝试生成本地字典(最大-100000)。注意:当LOCAL_DICTIONARY_THRESHOLD被定义为复杂列时,所有子列的独立记录数被加起来。

LOCAL_DICTIONARY_INCLUDE

 

字符串/varchar/char列

必须为其生成本地字典的列。只有当需要为少数列生成本地字典,而跳过其他列时,才需要配置这个属性。只有当LOCAL_DICTIONARY_ENABLE为真或carbon.local.dictionary.enable为真时,这个属性才会生效。

LOCAL_DICTIONARY_EXCLUDE

没有

不需要生成本地字典的列。只有当需要跳过少数列的本地字典,为其他列生成本地字典时,才需要配置这个属性。只有当LOCAL_DICTIONARY_ENABLE为真或carbon.local.dictionary.enable为真时,这个属性才会生效。

回退行为。

当某一列的cardinality超过阈值时,会触发回退,生成的字典将被还原,数据加载将在没有字典编码的情况下继续。

如果是复杂的列,当所有子列的独立记录的总和值超过定义的LOCAL_DICTIONARY_THRESHOLD值时,将触发回退。

注意:当回退被触发时,数据加载性能将下降,因为编码数据将被丢弃,实际数据被写入临时排序文件。

需要注意的几点。

减少区块大小。

由于压缩率高,在本地字典的情况下,生成的块数较少。这可能会减少查询过程中启动的任务数量,如果修剪的块比可运行的并行任务数量少,就会导致查询性能下降。因此,建议配置较小的块大小,从而产生更多的块数量。

例子。

CREATE TABLE carbontable(             

  column1 string,             

  column2 string,             

  column3 LONG)

STORED AS carbondata

TBLPROPERTIES('LOCAL_DICTIONARY_ENABLE'='true','LOCAL_DICTIONARY_THRESHOLD'='1000',

'LOCAL_DICTIONARY_INCLUDE'='column1','LOCAL_DICTIONARY_EXCLUDE'='column2')

 

注意:

  • 我们建议在卡片数量较多但分布于多个负载的情况下使用本地字典。
倒置的索引配置

默认情况下,倒置索引是被禁用的,因为存储的大小将被减少,它可以通过使用表属性来启用。它可能有助于提高压缩率和查询速度,特别是对于处于奖励位置的低cardinality列。建议的使用情况:对于高cardinality列,你可以禁用倒置索引以提高数据加载性能。

注意:在INVERTED_INDEX中指定的列也应该出现在SORT_COLUMNS中。

TBLPROPERTIES ('SORT_COLUMNS'='column2,column3', 'INVERTED_INDEX'='column2, column3')

 

排序列配置

此属性供用户指定哪些列属于MDK(多维键)索引。

如果用户没有指定 "SORT_COLUMNS "属性,默认情况下不会对任何列进行排序。

o 如果指定了这个属性,但参数为空,那么表将被加载,没有排序。

这只支持字符串,日期,时间戳,短,英,长,字节和布尔数据类型。建议使用情况:只为需要的列建立MDK索引,它可能有助于提高数据加载性能。

TBLPROPERTIES ('SORT_COLUMNS'='column1, column3')

注意:不支持复杂数据类型列、二进制、双数、浮点数、十进制数据类型的Sort_Columns。

分类范围配置

此属性供用户在数据加载时指定排序的范围,以下是排序范围的类型。

o LOCAL_SORT:数据将被本地排序(任务级排序)。

o NO_SORT:默认范围。它将以不排序的方式加载数据,它将显著提高加载性能。

o GLOBAL_SORT。它可以提高查询性能,尤其是高并发点查询。而且如果你严格关心加载资源的隔离问题,因为系统使用spark GroupBy对数据进行排序,资源可以由spark控制。

例子。

CREATE TABLE IF NOT EXISTS productSchema.productSalesTable (

  productNumber INT,

  productName STRING,

  storeCity STRING,

  storeProvince STRING,

  productCategory STRING,

  productBatch STRING,

  saleQuantity INT,

  revenue INT)

STORED AS carbondata

TBLPROPERTIES ('SORT_COLUMNS'='productName,storeCity',

               'SORT_SCOPE'='LOCAL_SORT')

 

注意:CarbonData也支持 "使用Carbonondata"。在CarbonData repo中的SparkSessionExample中可以找到示例代码。

表块大小配置

此属性用于设置此表的块大小,默认值为1024MB,支持范围为1MB至2048MB。

tblproperties('table_blocksize'='512')。

注意:512或512M都可以接受。

表小块尺寸配置

该属性用于设置carbondata文件中的blocklet大小,默认值为64MB。区块是最小的IO读取单位,在点查询的情况下,减少区块大小可能会提高查询性能。

使用实例。

TBLPROPERTIES ('TABLE_BLOCKLET_SIZE'='8')

表页尺寸配置

此属性用于设置carbondata文件中的页面大小,支持的范围是1MB到1755MB。如果页面大小在32000行之前越过这个值,页面将被削减到这个数量的行。有助于保持页面大小以适应cpu缓存大小。

如果表有字符串、varchar、二进制或复杂数据类型的列,就可以配置这个属性。因为对于这些列,一个页面中的32000行可能超过1755MB,在这种情况下,snappy压缩会失败。另外,如果页面大小很大,页面就无法装入CPU缓存。所以,配置较小的这个属性值(比如1MB)可以更好地利用CPU缓存的页面。

使用实例。

TBLPROPERTIES ('TABLE_PAGE_SIZE_INMB'='5')

表压实配置

这些属性是表级压实配置,如果没有指定,将使用carbon.properties中的系统级配置。以下是5个配置。

o MAJOR_COMPACTION_SIZE:与carbon.major.compaction.size含义相同,大小为MB。

o AUTO_LOAD_MERGE:与carbon.enable.auto.load.merge含义相同。

o COMPACTION_LEVEL_THRESHOLD:与carbon.compaction.level.threshold含义相同。

o COMPACTION_PRESERVE_SEGMENTS:与carbon.numberof.preserve.segments含义相同。

o ALLOWED_COMPACTION_DAYS:与carbon.allowed.compaction.day含义相同。

TBLPROPERTIES ('MAJOR_COMPACTION_SIZE'='2048',

               'AUTO_LOAD_MERGE'='true',

               'COMPACTION_LEVEL_THRESHOLD'='5,6',

               'COMPACTION_PRESERVE_SEGMENTS'='10',

               'ALLOWED_COMPACTION_DAYS'='5')

流媒体

CarbonData支持实时数据的流式摄入。你可以使用以下表的属性来创建 "流 "表。

TBLPROPERTIES ('streaming'='true')

缓存所需列的最小/最大值

默认情况下,CarbonData缓存了模式中所有列的最小和最大值。随着负载的增加,保存最小和最大值所需的内存会大大增加。这个功能使你能够只为需要的列配置最小和最大值,从而优化内存的使用。该功能不支持二进制数据类型。

以下是COLUMN_META_CACHE的有效值。

如果你想在驱动程序中不缓存任何列的最小/最大值。

COLUMN_META_CACHE=''

如果你想在驱动中只缓存col1的最小/最大值。

COLUMN_META_CACHE='col1'。

如果你想把所有指定列的最小/最大值缓存在驱动中。

COLUMN_META_CACHE='col1,col2,col3,?'

要缓存的列可以在创建表时或创建表后指定。在创建表的过程中,在表的属性中指定要缓存的列。

语法。

CREATE TABLE [dbName].tableName (col1 String, col2 String, col3 int,?) STORED AS carbondata TBLPROPERTIES ('COLUMN_META_CACHE'='col1,col2,?')

例子。

CREATE TABLE employee (name String, city String, id int) STORED AS carbondata TBLPROPERTIES ('COLUMN_META_CACHE'='name')

在创建表或已经创建的表上,使用alter table命令来配置要缓存的列。

语法。

ALTER TABLE [dbName].tableName SET TBLPROPERTIES ('COLUMN_META_CACHE'='col1,col2,?')

 

例子。

ALTER TABLE employee SET TBLPROPERTIES ('COLUMN_META_CACHE'='city')

 

在区块或小区块层面的缓存

这个功能允许你在Block级别维护缓存,从而优化内存的使用。如果维持Blocklet级别的缓存,内存消耗会很高,因为一个Block可以有多个Blocklet。

以下是CACHE_LEVEL的有效值。

驱动器中块级缓存的配置(默认值)。

CACHE_LEVEL= 'BLOCK'

 

Blocklet层面上配置驱动程序中的缓存。

CACHE_LEVEL= 'BLOCKLET'

 

缓存级别可以在创建表时或创建表后指定。在创建表的操作中,在表的属性中指定缓存级别。

语法。

CREATE TABLE [dbName].tableName (col1 String, col2 String, col3 int,?) STORED AS carbondata TBLPROPERTIES ('CACHE_LEVEL'='Blocklet')

 

例子。

CREATE TABLE employee (name String, city String, id int) STORED AS carbondata TBLPROPERTIES ('CACHE_LEVEL'='Blocklet')

 

在创建表之后或者在已经创建的表上使用alter table命令来配置缓存级别。

语法。

ALTER TABLE [dbName].tableName SET TBLPROPERTIES ('CACHE_LEVEL'='Blocklet')

 

例子。

ALTER TABLE employee SET TBLPROPERTIES ('CACHE_LEVEL'='Blocklet')

 

支持与Hive/Parquet相同的扁平文件夹

这个功能允许所有的carbondata和索引文件直接保存在tablepath下。目前,所有的carbondata/carbonindex文件都写在tablepath/Fact/Part0/Segment_NUM文件夹下,它与hive/parquet文件夹结构不同。这个功能使得所有的文件都直接写在tablepath下,它不需要维护任何段的文件夹结构。这对于执行引擎之间的互操作性是非常有用的,而且与其他执行引擎如hive或presto的插件也变得更容易。

以下表格属性启用了该功能,默认值为false。

'flat_folder'='true'。

例子。

CREATE TABLE employee (name String, city String, id int) STORED AS carbondata TBLPROPERTIES ('flat_folder'='true')

 

长于32000字符的字符串

在常见的情况下,字符串的长度小于32000,所以carbondata使用Short来存储内容的长度,以减少内存和空间的消耗。为了支持超过32000个字符的字符串,carbondata引入了一个名为LONG_STRING_COLUMNS的表属性。对于这些列,carbondata内部使用Integer来存储内容的长度。

你可以使用下面的tblProperties将这些列指定为 "长字符串列"。

// specify col1, col2 as long string columns

TBLPROPERTIES ('LONG_STRING_COLUMNS'='col1,col2')

此外,你也可以通过DataFrame使用这个属性,方法是

df.format("carbondata")

  .option("tableName", "carbonTable")

  .option("long_string_columns", "col1, col2")

  .save()

如果你使用Carbon-SDK,你可以指定长字符串列的数据类型为varchar。你可以参考SDKwriterTestCase的例子。

注意:LONG_STRING_COLUMNS只能是字符串/char/varchar列,不能是sort_columns/complex列。

压缩表

CarbonData也支持数据压缩。默认情况下,Snappy被用来压缩数据。CarbonData也支持ZSTD和GZIP压缩器。

用户可以在表格属性中指定压缩机。

TBLPROPERTIES('carbon.column.compressor'='GZIP')

TBLPROPERTIES('carbon.column.compressor'='zstd')

如果配置了压缩机,所有的数据加载和压实将使用该压缩机。如果没有配置压缩机,数据加载和压实将使用当前系统属性中的压缩机。在这种情况下,如果每次改变系统属性,每次加载的压缩机可能会有所不同。如果你想改变一个表的压缩机,这很有帮助。相应的系统属性在carbon.properties文件中被配置如下。

carbon.column.compressor=snappy

carbon.column.compressor=zstd

坏记录路径

此属性用于指定写入不良记录的位置。由于表的路径在重命名后保持不变,因此用户可以使用此属性在创建时为表指定不良记录的路径,这样以后就可以在表的描述中看到相同的路径供参考。

TBLPROPERTIES('BAD_RECORD_PATH'='/opt/badrecords')

加载最小数据量

此属性指示用于数据加载的每个节点的最小输入数据大小。默认情况下,它未被启用。设置一个非零的整数值将启用此功能。如果你有一个大的集群,并且只想让一小部分节点处理数据加载,那么这个属性就很有用。例如,如果你有一个有10个节点的集群,输入的数据大约是1GB。如果没有这个属性,每个节点将处理大约100MB的输入数据,并导致至少10个数据文件。如果将此属性配置为512,则只选择2个节点来处理输入数据,每个节点的输入数据约为512MB,根据压缩率,会产生约2或4个文件。此外,这个属性也可以在加载选项中指定。请注意,一旦你启用这个功能,为了负载平衡,carbondata在分配输入数据给节点时将忽略数据的地域性,这将导致更多的网络流量。

TBLPROPERTIES('load_min_size_inmb'='256')

范围栏

此属性用于指定一个列,以按范围划分输入数据。只能配置一列。在数据加载期间,你可以使用 "global_sort_partitions "或 "scale_factor "来避免生成小文件。这个功能不支持二进制数据类型。

TBLPROPERTIES('RANGE_COLUMN'='col1')

索引缓存的过期时间(秒)。

Carbon在驱动端维护索引缓存,缓存将在此表属性指示的秒后过期。

TBLPROPERTIES('index_cache_expiration_seconds'='1')

在创建表之后或者在已经创建的表上使用alter table命令来配置缓存过期时间。

语法。

 ALTER TABLE [dbName].tableName SET TBLPROPERTIES ('index_cache_expiration_seconds'='3')

 

创建表作为选择

这个函数允许用户从任何一个Parquet/Hive/Carbon表中创建一个Carbon表。当用户想从任何其他Parquet/Hive表中创建Carbon表,并使用Carbon查询引擎进行查询,并在Carbon比其他文件格式更快的情况下获得更好的查询结果时,这是很有利的。同时,这一功能也可用于备份数据。

CREATE TABLE [IF NOT EXISTS] [db_name.]table_name

STORED AS carbondata

[TBLPROPERTIES (key1=val1, key2=val2, ...)]

AS select_statement;

实例

carbon.sql(

           s"""

              | CREATE TABLE source_table(

              |   id INT,

              |   name STRING,

              |   city STRING,

              |   age INT)

              | STORED AS parquet

           """.stripMargin)

              

carbon.sql("INSERT INTO source_table SELECT 1,'bob','shenzhen',27")

 

carbon.sql("INSERT INTO source_table SELECT 2,'david','shenzhen',31")

 

carbon.sql(

           s"""

              | CREATE TABLE target_table

              | STORED AS carbondata

              | AS SELECT city, avg(age)

              |    FROM source_table

              |    GROUP BY city

           """.stripMargin)

            

carbon.sql("SELECT * FROM target_table").show

 

// results:

//    +--------+--------+

//    |    city|avg(age)|

//    +--------+--------+

//    |shenzhen|    29.0|

//    +--------+--------+

 

创建外部表

这个函数允许用户通过指定位置来创建外部表。

CREATE EXTERNAL TABLE [IF NOT EXISTS] [db_name.]table_name

STORED AS carbondata LOCATION '$FilesPath'

在管理表数据位置上创建外部表。

提供的管理表数据位置将有FACT和Metadata文件夹。这个数据可以通过创建一个普通的碳表来生成,并在上述语法中使用这个路径作为$FilesPath。

例子。

sql("CREATE TABLE origin(key INT, value STRING) STORED AS carbondata")

sql("INSERT INTO origin select 100,'spark'")

sql("INSERT INTO origin select 200,'hive'")

// creates a table in $storeLocation/origin

 

sql(

    s"""

       | CREATE EXTERNAL TABLE source

       | STORED AS carbondata

       | LOCATION '$storeLocation/origin'

    """.stripMargin)

sql("SELECT count(*) from source").show()

在非交易表的数据位置上创建外部表。

非交易表数据位置将只有carbondata和carbondindex文件,不会有元数据文件夹(表状态和模式)。我们的SDK模块目前支持以这种格式写入数据。

例子。

sql(

    s"""

       | CREATE EXTERNAL TABLE sdkOutputTable STORED AS carbondata LOCATION

       |'$writerPath'

    """.stripMargin)

在这里,写作者的路径将有carbondata和index文件。这可以是SDK输出或C++ SDK输出。参考SDK指南C++ SDK指南

请注意。

1. 丢弃外部表不会删除存在于该位置的文件。

2. 当在非交易表数据上创建外部表时,外部表将被注册在carbondata文件的模式中。如果多个文件有相同的列,但数据类型不同,则会产生异常。

创建数据库

这个函数创建一个新的数据库。默认情况下,数据库是在Carbon商店的位置创建的,但你也可以指定自定义位置。

CREATE DATABASE [IF NOT EXISTS] database_name [LOCATION path];

例子

CREATE DATABASE carbon LOCATION "hdfs://name_cluster/dir1/carbonstore";

餐桌管理

显示表格

这条命令可以用来列出当前数据库中的所有表或某个特定数据库的所有表。

SHOW TABLES [IN db_Name]

例子。

SHOW TABLES

OR

SHOW TABLES IN defaultdb

ALTER TABLE

以下部分介绍了修改现有表的物理或逻辑状态的命令。

重命名表

该命令用于重命名现有的表。

ALTER TABLE [db_name.]table_name RENAME TO new_table_name

例子。

ALTER TABLE carbon RENAME TO carbonTable

OR

ALTER TABLE test_db.carbon RENAME TO test_db.carbonTable

添加栏目

这条命令用于在现有表格中增加一个新的列。

ALTER TABLE [db_name.]table_name ADD COLUMNS (col_name data_type, ...)

TBLPROPERTIES('DEFAULT.VALUE.COLUMN_NAME'='default_value')

例子。

ALTER TABLE carbon ADD COLUMNS (a1 INT, b1 STRING)

ALTER TABLE carbon ADD COLUMNS (a1 INT, b1 STRING) TBLPROPERTIES('DEFAULT.VALUE.a1' ='10')

注意:不支持添加复杂数据类型的列。

用户可以在添加新的列后,指定哪些列要包括和排除在本地字典的生成中。这些列将分别与主表中已经存在的本地字典的包括和排除列相加。

 ```

 ALTER TABLE carbon ADD COLUMNS (a1 STRING, b1 STRING) TBLPROPERTIES('LOCAL_DICTIONARY_INCLUDE'='a1', 'LOCAL_DICTIONARY_EXCLUDE'='b1')

 ```

丢弃栏目

这条命令用于删除表内现有的列。

ALTER TABLE [db_name.]table_name DROP COLUMNS (col_name, ...)

例子。

ALTER TABLE carbon DROP COLUMNS (b1)

OR

ALTER TABLE test_db.carbon DROP COLUMNS (b1)

 

ALTER TABLE carbon DROP COLUMNS (c1,d1)

注意:不支持删除复杂的子列。

改变列名/类型

这条命令用来改变列名和数据类型,从INT到BIGINT或者从低精度到高精度的十进制。只有在没有数据丢失的情况下,才支持将小数数据类型从低精度改为高精度。

ALTER TABLE [db_name.]table_name CHANGE col_old_name col_new_name column_type

有效情景

无效的情况 - 将小数点精度从(10,2)改为(10,5)是无效的,因为在这种情况下,只有比例增加,但总位数保持不变。

有效情况 - 将小数点精度从(10,2)改为(12,3)是有效的,因为总的数字数增加了2,但比例只增加了1,不会导致任何数据丢失。

注意:允许的范围是38,38(精度,比例),是有效的大写情况,不会导致数据丢失。

1:将列a1的名称改为a2,数据类型从INT改为BIGINT。

ALTER TABLE test_db.carbon CHANGE a1 a2 BIGINT

2:将a1列的小数精度从10改为18。

ALTER TABLE test_db.carbon CHANGE a1 a1 DECIMAL(18,2)

3:将a3列的名称改为a4。

ALTER TABLE test_db.carbon CHANGE a3 a4 STRING

注意:一旦列被重新命名,用户必须注意用新的名称替换文件头或改变csv文件中的列头。

合并索引

该命令用于将一个段内的所有CarbonData索引文件(.carbonindex)合并为一个CarbonData索引合并文件(.carbonindexmerge)。这增强了第一次查询的性能。

ALTER TABLE [db_name.]table_name COMPACT 'SEGMENT_INDEX' 。

例子。

ALTER TABLE test_db.carbon COMPACT 'SEGMENT_INDEX' 。

注意:

o 流式表不支持合并索引。

设置和未设置

当使用set命令时,所有新设置的属性将覆盖相应的旧属性(如果存在)。

本地字典属性

例如,设置本地字典属性。

ALTER TABLE tablename SET TBLPROPERTIES('LOCAL_DICTIONARY_ENABLE'='false','LOCAL_DICTIONARY_THRESHOLD'='1000','LOCAL_DICTIONARY_INCLUDE'='column1','LOCAL_DICTIONARY_EXCLUDE'='column2')

当本地字典属性未设置时,将为这些属性使用相应的默认值。

例子到UNSET本地字典属性。

ALTER TABLE tablename UNSET TBLPROPERTIES('LOCAL_DICTIONARY_ENABLE','LOCAL_DICTIONARY_THRESHOLD','LOCAL_DICTIONARY_INCLUDE','LOCAL_DICTIONARY_EXCLUDE')

注意:对于旧表,默认情况下,本地字典是禁用的。如果用户想要这些表的本地字典,用户可以自行决定是否为新数据启用/禁用本地字典。这可以通过使用 alter table set 命令来实现。

筛选范围

SET SORT SCOPE为例。

ALTER TABLE tablename SET TBLPROPERTIES('SORT_SCOPE'='NO_SORT')

当排序范围未设置时,将使用默认值(NO_SORT)。

UNSET SORT SCOPE为例。

ALTER TABLE tablename UNSET TBLPROPERTIES('SORT_SCOPE')

排序栏目

SET SORT COLUMNS为例。

ALTER TABLE tablename SET TBLPROPERTIES('SORT_COLUMNS'='column1')

在这个操作之后,新的加载将使用新的SORT_COLUMNS。用户可以根据查询的需要调整SORT_COLUMNS,但不会直接影响到旧数据。所以不会影响没有被新SORT_COLUMNS排序的旧数据段的查询性能。

不支持UNSET,但是可以将SORT_COLUMNS设置为空字符串,而不是使用UNSET。注意:当SORT_SCOPE不是NO_SORT时,设置SORT_COLUMNS为空字符串是无效的。

ALTER TABLE tablename SET TBLPROPERTIES('SORT_COLUMNS'='')

注意:

§ 1.6或更高版本中,"自定义 "压实支持对旧段一个一个地重新排序。

§ 流媒体表不支持SORT_COLUMNS修改。

§ 如果从新的SORT_COLUMNS中移除倒置索引列,它们将不会创建倒置索引。但是INVERTED_INDEX的旧配置将被保留。

DROP表

这条命令用于删除一个现有的表。

DROP TABLE [IF EXISTS] [db_name.]table_name

例子。

DROP TABLE IF EXISTS productSchema.productSalesTable

刷新表

该命令用于从现有的Carbon表数据向HIVE元存储目录注册Carbon表。

REFRESH TABLE $db_NAME.$table_NAME

例子。

REFRESH TABLE dbcarbon.productSalesTable

注意:

  • 新的数据库名称和旧的数据库名称应该是一样的。
  • 在执行这个命令之前,旧的表结构和数据应该被复制到新的数据库位置。
  • 如果该表是聚合表,那么所有的聚合表都应该被复制到新的数据库位置。
  • 对于旧存储,源和目标集群的时区应该是相同的。
  • 如果旧集群使用HIVE元存储来存储模式,刷新将不工作,因为文件系统中不存在模式文件。

表和列的注释

你可以通过使用表注释来提供更多关于表的信息。同样,你也可以用列注释来提供关于某个特定列的更多信息。你可以使用describe formatted命令查看一个现有表格的列注释。

CREATE TABLE [IF NOT EXISTS] [db_name.]table_name[(col_name data_type [COMMENT col_comment], ...)]

  [COMMENT table_comment]

STORED AS carbondata

[TBLPROPERTIES (property_name=property_value, ...)]

 

例子。

CREATE TABLE IF NOT EXISTS productSchema.productSalesTable (

                              productNumber Int COMMENT 'unique serial number for product')

COMMENT "This is table comment"

STORED AS carbondata

 

你也可以使用ALTER命令设置和取消表的注释。

SET表的注释为例。

ALTER TABLE carbon SET TBLPROPERTIES ('comment'='this table comment is modified');

例子到UNSET表的注释。

ALTER TABLE carbon UNSET TBLPROPERTIES('comment')。

分区

标准分区

该分区与spark和hive的分区类似,用户可以使用任何列来建立分区。

创建分区表

这个命令允许你创建带有分区的表。

CREATE TABLE [IF NOT EXISTS] [db_name.]table_name

  [(col_name data_type , ...)]

  [COMMENT table_comment]

  [PARTITIONED BY (col_name data_type , ...)]

  [STORED AS file_format]

  [TBLPROPERTIES (property_name=property_value, ...)]

 

例子。

CREATE TABLE IF NOT EXISTS productSchema.productSalesTable (

                              productNumber INT,

                              productName STRING,

                              storeCity STRING,

                              storeProvince STRING,

                              saleQuantity INT,

                              revenue INT)

PARTITIONED BY (productCategory STRING, productBatch STRING)

STORED AS carbondata

注意:复杂数据类型的列不支持Hive分区。

显示分区

这条命令得到了表的Hive分区信息

SHOW PARTITIONS [db_name.]table_name

删除分区

这条命令只丢弃指定的Hive分区。

ALTER TABLE table_name DROP [IF EXISTS] PARTITION (part_spec, ...)

例子。

ALTER TABLE locationTable DROP PARTITION (country = 'US');

插入overWRITE

这个命令允许你在一个特定的分区上插入或加载覆盖。

INSERT OVERWRITE TABLE table_name

PARTITION (column = 'partition_name')

select_statement

 

例子。

INSERT OVERWRITE TABLE partitioned_user

PARTITION (country = 'US')

SELECT * FROM another_user au

WHERE au.country = 'US';

显示分区

执行以下命令以获得表的分区信息

SHOW PARTITIONS [db_name.]table_name

添加一个新的分区

ALTER TABLE [db_name].table_name ADD PARTITION('new_partition')

分割一个分区

ALTER TABLE [db_name].table_name SPLIT PARTITION(partition_id) INTO('new_partition1', 'new_partition2'... )

删除一个分区

只删除分区定义,但保留数据

ALTER TABLE [db_name].table_name DROP PARTITION(partition_id)

 

同时删除分区定义和数据

ALTER TABLE [db_name].table_name DROP PARTITION(partition_id) WITH DATA

注意:

  • 对于ADD、SPLIT和DROP命令,不支持哈希分区表。
  • 分区标识:在CarbonData中,像蜂巢一样,文件夹并不是用来划分分区的,而是用分区标识来代替任务标识。它可以利用这一特性,同时减少一些元数据。

SegmentDir/0_batchno0-0-1502703086921.carbonindex

          ^

SegmentDir/part-0-0_batchno0-0-1502703086921.carbondata

                   ^

这里有一些有用的提示,以提高carbonData分区表的查询性能。

  • 被分割的列可以从SORT_COLUMNS中排除,这将让其他列做有效的排序。
  • 在分区表上编写SQL时,尽量在分区列上使用过滤器。

BUCKETING

Bucketing功能可用于将表/分区数据分配/组织到多个文件中,使类似的记录出现在同一个文件中。在创建一个表时,用户需要指定用于桶的列和桶的数量。对于桶的选择,使用列的哈希值。

CREATE TABLE [IF NOT EXISTS] [db_name.]table_name

                  [(col_name data_type, ...)]

STORED AS carbondata

TBLPROPERTIES('BUCKET_NUMBER'='noOfBuckets',

'BUCKET_COLUMNS'='columnname')

 

注意:

  • 对于复杂数据类型的列,不能进行Bucketing。
  • BUCKETCOLUMN参数中的列必须是尺寸。BUCKETCOLUMN参数不能是措施或措施和尺寸的组合。

例子。

CREATE TABLE IF NOT EXISTS productSchema.productSalesTable (

  productNumber INT,

  saleQuantity INT,

  productName STRING,

  storeCity STRING,

  storeProvince STRING,

  productCategory STRING,

  productBatch STRING,

  revenue INT)

STORED AS carbondata

TBLPROPERTIES ('BUCKET_NUMBER'='4', 'BUCKET_COLUMNS'='productName')

 

CACHE

CarbonData内部使用LRU缓存来提高性能。用户可以通过以下命令获得当前内存中缓存使用状态的信息。

SHOW METACACHE

 

这显示了按类别--索引文件、字典和索引--在缓存中消耗的总体内存。这也显示了当前数据库中所有表和子表的缓存使用情况。

 SHOW EXECUTOR METACACHE

 

这显示了索引服务器的每个执行器中的缓存所消耗的总体内存。这个命令只有在碳属性carbon.enable.index.server被设置为 "true "时才允许使用。

SHOW METACACHE ON TABLE tableName

 

这显示了tableName和它的carbonindex文件,它的字典文件,它的索引和子表的缓存使用情况的详细信息。

这个命令在子表上是不允许的。

  DROP METACACHE ON TABLE tableName

 

这将清除tabletableName、其碳索引文件、其字典文件、其索引和子表在缓存中的任何条目。

这个命令在子表上是不允许的。

重要观点

1. 缓存信息只有在执行选择查询后才会更新。

2. 在改变表的情况下,当任何后续的选择查询被启动时,已经加载的缓存就会失效。

3.只有当字典列被查询时,字典才会被加载到缓存中。如果我们不对字典列做直接查询,缓存就不会被加载。如果我们做SELECT * FROM t1,即使在这种情况下字典被加载,它也是在执行器中被加载,而不是在驱动上,最后的结果行被返回给驱动,因此如果我们做SHOW METACACHE或SHOW METACACHE ON TABLE t1,将不会在驱动缓存上产生任何痕迹。

 

posted @ 2021-09-17 14:44  田野与天  阅读(320)  评论(0编辑  收藏  举报