06 分区

创建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时,请尝试在分区列上使用过滤器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值