建表
CREATE TABLE [IF NOT EXISTS] [db_name.]table_name
[(col_name data_type , ...)]
STORED BY 'carbondata'
[TBLPROPERTIES (property_name=property_value, ...)]
// All Carbon's additional table options will go into properties
字典编码配置
所有字符串列默认启用字典编码,非字符串列则禁用字典编码。 您可以包含和排除字典编码的列。
TBLPROPERTIES ('DICTIONARY_EXCLUDE'='column1, column2')
TBLPROPERTIES ('DICTIONARY_INCLUDE'='column1, column2')
DICTIONARY_EXCLUDE将会排除字典创建。 这适用于高基数列,并且是可选参数。
(需关注1.3发布release):1.3版本可能会废除这个配置,默认不再为string类型的维度建全局字典
DICTIONARY_INCLUDE将为列表中指定的列生成字典。
Table Block Size配置
表文件的块大小可以使用属性TABLE_BLOCKSIZE定义。 它只接受整数值。 默认值是1024 MB,支持1 MB到2048 MB的范围。 如果您不在DDL命令中指定此值,则使用默认值。
TBLPROPERTIES ('TABLE_BLOCKSIZE'='512')
这里512 MB表示该表的块大小是512MB,也可以将其设置为512M或512。
Inverted Index配置
倒排索引对于提高压缩率和查询速度是非常有用的,特别是那些处于奖励位置(reward position???)的低基数列。 默认情况下,倒排索引是启用的。 用户可以禁用某些列的倒排索引创建。
TBLPROPERTIES ('NO_INVERTED_INDEX'='column1, column3')
NO_INVERTED_INDEX中指定的列不会生成倒排索引。 此属性适用于高基维度列,并且是可选参数。
建议:对于高基数列,可以禁用倒排索引以提高数据加载性能。
注意:
默认情况下,数字数据类型以外的所有列都被视为维度,数字数据类型的所有列都被视为度量值。
除复杂数据类型列之外的所有维都是多维密钥(MDK)的一部分。 这种行为可以通过使用TBLPROPERTIES来覆盖。 如果用户想要在多维键中保留任何列(除了复杂数据类型的列),那么他可以将列保留在DICTIONARY_EXCLUDE或DICTIONARY_INCLUDE中。
排序列配置Sort Columns Configuration
“SORT_COLUMN”属性供用户指定哪些列属于MDK索引。
- 如果用户没有指定“SORT_COLUMN”属性,则默认情况下,MDK索引是使用除复杂数据类型列以外的所有维列构建的。
- 如果指定了这个属性,但是参数为空,那么该表在加载时不会被排序。
建议的用法:只为所需的列建立MDK索引,这可能有助于提高数据加载性能。
TBLPROPERTIES ('SORT_COLUMNS'='column1, column3')
OR
TBLPROPERTIES ('SORT_COLUMNS'='')
排序范围配置 Sort Scope Configuration
该属性供用户在数据加载期间指定排序的范围,以下是排序范围的类型:
- LOCAL_SORT:这是默认的排序范围。
- NO_SORT:将以未经排序的方式加载数据,这将明显影响加载性能。
- BATCH_SORT:它增加了加载性能,但是如果 identified blocks > parallelism,则会降低查询性能。
- GLOBAL_SORT:增加查询性能,特别是高并发点查询。 如果你对严格加载时资源隔离比较在意,因为系统使用SparkgroupBy对数据进行排序,资源可以通过spark来控制。
TBLPROPERTIES ('SORT_SCOPE'='BATCH_SORT')
Example:
CREATE TABLE IF NOT EXISTS productSchema.productSalesTable (
productNumber Int,
productName String,
storeCity String,
storeProvince String,
productCategory String,
productBatch String,
saleQuantity Int,
revenue Int)
STORED BY 'carbondata'
TBLPROPERTIES ('DICTIONARY_INCLUDE'='productNumber',
'NO_INVERTED_INDEX'='productBatch',
'SORT_COLUMNS'='productName,storeCity',
'SORT_SCOPE'='NO_SORT',
'TABLE_BLOCKSIZE'='512')
管理表
SHOW TABLE
此命令可用于列出当前库中的所有表或特定库的所有表。
SHOW TABLES [IN db_Name]
Example:
SHOW TABLES
OR
SHOW TABLES IN defaultdb
ALTER TALBE
RENAME TABLE
该命令用于重命名现有的表。
ALTER TABLE [db_name.]table_name RENAME TO new_table_name
Examples:
ALTER TABLE carbon RENAME TO carbondata
OR
ALTER TABLE test_db.carbon RENAME TO test_db.carbondata
ADD COLUMNS
该命令用于向现有表中添加新列
ALTER TABLE [db_name.]table_name ADD COLUMNS (col_name data_type,...)
TBLPROPERTIES('DICTIONARY_INCLUDE'='col_name,...',
'DEFAULT.VALUE.COLUMN_NAME'='default_value')
Examples:
ALTER TABLE carbon ADD COLUMNS (a1 INT, b1 STRING)
ALTER TABLE carbon ADD COLUMNS (a1 INT, b1 STRING) TBLPROPERTIES('DICTIONARY_INCLUDE'='a1')
ALTER TABLE carbon ADD COLUMNS (a1 INT, b1 STRING) TBLPROPERTIES('DEFAULT.VALUE.a1'='10')
DROP COLUMNS
该命令用于删除表中现有的列。
ALTER TABLE [db_name.]table_name DROP COLUMNS (col_name, ...)
Examples:
ALTER TABLE carbon DROP COLUMNS (b1) OR ALTER TABLE test_db.carbon DROP COLUMNS (b1) ALTER TABLE carbon DROP COLUMNS (c1,d1)
CHANGE DATA TYPE
该命令用于将数据类型从INT更改为BIGINT,或将数据类型从低更改为更高。仅在没有数据丢失的情况下才支持将十进制数据类型从较低精度更改为较高精度。
ALTER TABLE [db_name.]table_name CHANGE col_name col_name changed_column_type
有效的方案
- 无效场景 - 从(10,2)到(10,5)的小数精度的变化是无效的,因为在这种情况下只有比例增加,但是总的位数保持不变。
- 有效的方案 - 从(10,2)到(12,3)的小数精度的改变是有效的,因为总位数增加了2,但是缩放只增加1,这不会导致任何数据丢失。
- 注意:允许的范围是38,38(精度,范围),是一个有效的大写情况,不会导致数据丢失。
示例1:将列a1的数据类型从INT更改为BIGINT。
ALTER TABLE test_db.carbon CHANGE a1 a1 BIGINT
示例2:将列a1的小数精度从10更改为18。
ALTER TABLE test_db.carbon CHANGE a1 a1 DECIMAL(18,2)
DROP TABLE
该命令用于删除现有的表。
DROP TABLE [IF EXISTS] [db_name.]table_name
Example:
DROP TABLE IF EXISTS productSchema.productSalesTable
加载数据
将数据文件加载到CARBONDATA表
见Loda Data
INSERT DATA INTO CARBONDATA TABLE
该命令将数据插入到CarbonData表中。 它将源表中的记录插入到目标CarbonData表中,源表可以是Hive表,Parquet表或CarbonData表本身。 它具有通过在源表上执行Select查询来聚合表的记录并将其相应的结果记录加载到CarbonData表中的功能。
INSERT INTO TABLE <CARBONDATA TABLE> SELECT * FROM sourceTableName
[ WHERE { <filter_condition> } ]
您也可以省略table
关键字并将您的查询写为:
INSERT INTO <CARBONDATA TABLE> SELECT * FROM sourceTableName
[ WHERE { <filter_condition> } ]
覆盖插入数据:
INSERT OVERWRITE <CARBONDATA TABLE> SELECT * FROM sourceTableName
[ WHERE { <filter_condition> } ]
注意:
- 源表和CarbonData表必须具有相同的schema。
- 源表和目标表列的数据类型应该相同
- INSERT INTO命令不支持部分成功,如果发现错误的记录,全部失败。
- 当从源表插入到目标表时正在进行时,源表中的数据不能加载或更新。
Examples
INSERT INTO table1 SELECT item1, sum(item2 + 1000) as result FROM table2 group by item1
INSERT INTO table1 SELECT item1, item2, item3 FROM table2 where item2='xyz'
INSERT OVERWRITE table1 SELECT * FROM TABLE2
更新和删除
更新
该命令将允许根据列表达式和可选的过滤条件更新CarbonData表。
UPDATE <table_name>
SET (column_name1, column_name2, ... column_name n) = (column1_expression , column2_expression, ... column n_expression )
[ WHERE { <filter_condition> } ]
或者用下面的命令也可以更新CarbonData表:
UPDATE <table_name>
SET (column_name1, column_name2) =(select sourceColumn1, sourceColumn2 from sourceTable [ WHERE { <filter_condition> } ] )
[ WHERE { <filter_condition> } ]
注:如果源表中有多个输入行与目标表中的单行匹配,则update命令将失败。
Examples:
UPDATE t3 SET (t3_salary) = (t3_salary + 9) WHERE t3_name = 'aaa1'
UPDATE t3 SET (t3_date, t3_country) = ('2017-11-18', 'india') WHERE t3_salary < 15003
UPDATE t3 SET (t3_country, t3_name) = (SELECT t5_country, t5_name FROM t5 WHERE t5_id = 5) WHERE t3_id < 5
UPDATE t3 SET (t3_date, t3_serialname, t3_salary) = (SELECT '2099-09-09', t5_serialname, '9999' FROM t5 WHERE t5_id = 5) WHERE t3_id < 5
UPDATE t3 SET (t3_country, t3_salary) = (SELECT t5_country, t5_salary FROM t5 FULL JOIN t3 u WHERE u.t3_id = t5_id and t5_id=6) WHERE t3_id >6
删除
该命令允许我们从CarbonData表中删除记录。
DELETE FROM table_name [WHERE expression]
Examples:
DELETE FROM carbontable WHERE column1 = 'china'
DELETE FROM carbontable WHERE column1 IN ('china', 'USA')
DELETE FROM carbontable WHERE column1 IN (SELECT column11 FROM sourceTable2)
DELETE FROM carbontable WHERE column1 IN (SELECT column11 FROM sourceTable2 WHERE column1 = 'USA')
压缩
见05 数据压缩
分区
见 06 分区
BUCKETING
Bucketing功能可用于将表/分区数据分布/组织成多个文件,以便相同的文件中存在类似的记录。 创建table时,用户需要指定用于分包的列和bucket的数量。 使用列的哈希值进行分桶。
CREATE TABLE [IF NOT EXISTS] [db_name.]table_name
[(col_name data_type, ...)]
STORED BY 'carbondata'
TBLPROPERTIES('BUCKETNUMBER'='noOfBuckets',
'BUCKETCOLUMNS'='columnname')
注意:
- 复杂数据类型的列不能执行分桶。
BUCKETCOLUMN参数中的列只能是维度。 BUCKETCOLUMN参数不能是度量或度量和维度的组合。
Example:
CREATE TABLE IF NOT EXISTS productSchema.productSalesTable ( productNumber Int, saleQuantity Int, productName String, storeCity String, storeProvince String, productCategory String, productBatch String, revenue Int) STORED BY 'carbondata' TBLPROPERTIES ('BUCKETNUMBER'='4', 'BUCKETCOLUMNS'='productName')
SEGMENT 管理
SHOW SEGMENT
该命令用于获取CarbonData表的段。
SHOW SEGMENTS FOR TABLE [db_name.]table_name LIMIT number_of_segments
Example:
SHOW SEGMENTS FOR TABLE CarbonDatabase.CarbonTable LIMIT 4
DELETE SEGMENT BY ID
该命令用于通过使用段ID来删除段。 每个segment 都有唯一的segmentID。 使用此都有唯一的segmentID,您可以删除该分段。
以下命令将获得segmentID。
SHOW SEGMENTS FOR TABLE [db_name.]table_name LIMIT number_of_segments
检索要删除的段的段ID后,执行以下命令删除选定的段。
DELETE FROM TABLE [db_name.]table_name WHERE SEGMENT.ID IN (segment_id1, segments_id2, ...)
Example:
DELETE FROM TABLE CarbonDatabase.CarbonTable WHERE SEGMENT.ID IN (0)
DELETE FROM TABLE CarbonDatabase.CarbonTable WHERE SEGMENT.ID IN (0,5,8)
DELETE SEGMENT BY DATE
该命令将允许根据用户在DML命令中提供的日期存储中删除CarbonData段。 在特定日期之前创建的segments将从特定存储中删除。
DELETE FROM TABLE [db_name.]table_name WHERE SEGMENT.STARTTIME BEFORE DATE_VALUE
Example:
DELETE FROM TABLE CarbonDatabase.CarbonTable WHERE SEGMENT.STARTTIME BEFORE '2017-06-01 12:05:06'
当调用删除段DML时,段不会从文件系统中物理删除。 相反,segments状态将被标记为“标记为删除”。 对于查询执行,这个被删除的段将被排除。
删除的段将在使用“max.query.execution.time”配置的最大查询执行时间之后,某次加载操作期间被物理删除。 默认情况下是60分钟。
如果用户想要强制删除该段,那么他可以使用CLEAN FILES命令。
CLEAN FILES FOR TABLE table1
这个DML将会立即删除“标记为删除(Marked for delete)”和“Compacted”的段。