创建HASH分区表
CREATE TABLE [IF NOT EXISTS] [db_name.]table_name
[(col_name data_type , ...)]
PARTITIONED BY (partition_col_name data_type)
STORED BY 'carbondata'
[TBLPROPERTIES ('PARTITION_TYPE'='HASH',
'PARTITION_NUM'='N' ...)]
//N is the number of hash partitions
例如:
create table if not exists hash_partition_table(
col_A String,
col_B Int,
col_C Long,
col_D Decimal(10,2),
col_F Timestamp
) partitioned by (col_E Long)
stored by 'carbondata'
tblproperties('partition_type'='Hash','partition_num'='9')
创建范围分区表
CREATE TABLE [IF NOT EXISTS] [db_name.]table_name
[(col_name data_type , ...)]
PARTITIONED BY (partition_col_name data_type)
STORED BY 'carbondata'
[TBLPROPERTIES ('PARTITION_TYPE'='RANGE',
'RANGE_INFO'='2014-01-01, 2015-01-01, 2016-01-01' ...)]
注意:在 table properties中必须定义RANGE_INFO属性
Date/Timestamp类型分区默认格式是yyyy-MM-dd.可以在CarbonProperties中定义Date / Timestamp的替代格式。
例如:
create table if not exists hash_partition_table(
col_A String,
col_B Int,
col_C Long,
col_D Decimal(10,2),
col_E Long
) partitioned by (col_F Timestamp)
stored by 'carbondata'
tblproperties('partition_type'='Range',
'range_info'='2015-01-01, 2016-01-01, 2017-01-01, 2017-02-01')
创建列表分区表
CREATE TABLE [IF NOT EXISTS] [db_name.]table_name
[(col_name data_type , ...)]
PARTITIONED BY (partition_col_name data_type)
STORED BY 'carbondata'
[TBLPROPERTIES ('PARTITION_TYPE'='LIST',
'LIST_INFO'='A, B, C' ...)]
例如:
create table if not exists hash_partition_table(
col_B Int,
col_C Long,
col_D Decimal(10,2),
col_E Long,
col_F Timestamp
) partitioned by (col_A String)
stored by 'carbondata'
tblproperties('partition_type'='List',
'list_info'='aaaa, bbbb, (cccc, dddd), eeee')
Show Partitions
SHOW PARTITIONS [db_name.]table_name
新增一个新分区
ALTER TABLE [db_name].table_name ADD PARTITION('new_partition')
Split a partition
ALTER TABLE [db_name].table_name SPLIT PARTITION(partition_id) INTO('new_partition1', 'new_partition2'...)
Drop a partition
只删除分区定义,但保留数据
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命令不支持hash分区表。
Partition Id:在CarbonData中像hive一样,文件夹不是用来分区的,而是使用partition id来代替task id。 它可以利用这个特性减少一些元数据。
SegmentDir/0_batchno0-0-1502703086921.carbonindex ^ SegmentDir/part-0-0_batchno0-0-1502703086921.carbondata ^
tips
以下是一些tips,以提高carbondata分区表的查询性能:
事先分析适当的分区列
基于某个随机列的数据分布可能会偏斜,建立一个偏斜的分区表是没有意义的。
在创建分区表之前进行一些基本的统计分析,可以避免出现严重偏斜的列。
从排序列中排除分区列
如果您有很多维度,需要进行排序,分区列可以从SORT_COLUMNS中排除,这将使其他列可以进行高效排序。
记住在写SQL时在分区列上添加过滤器
在分区表上编写SQL时,请尝试在分区列上使用过滤器。