CREATE TABLE table_name (col1 data_type1, col2, data_type2, ... ) PARTITIONED BY (partition_key1 data_type1, partition_key2 data_type2...)
[$host]transwarp> CREATE TABLE exchange_platform.partition_user_info (
name STRING,
acc_num STRING,
password STRING,
citizen_id STRING,
bank_acc STRING,
reg_date STRING
) PARTITIONED BY (acc_level STRING);
这个例子中,acc_level是分区键(partition key)。
分区一旦完成,分区列就可以作为普通的列来使用 -- 所有的列操作对分区列都适用。也正因为这样,同一个表的分区列和列不能重名。如果出现重名,Inceptor会抛出一个失败信息:"FAILED: Error in semantic analysis: org.apache.hadoop.hive.ql.parse.SemanticException: Column repeated in partitioning columns".
.../part_user_info/acc_level=A
.../part_user_info/acc_level=B
.../part_user_info/acc_level=C
.../part_user_info/acc_level=D
.../part_user_info/acc_level=E
[$host] transwarp> SELECT * FROM partition_user_info WHERE acc_level ='A';执行这个语句时,Inceptor只读取了/part_user_info/acc_level=A下的信息,而忽略了其他的子目录。如果part_user_info没有被分区,Inceptor会进行全表扫描来完成这次查询。
[$host]transwarp> CREATE TABLE exchange_platform.doub_partition_user_info (
name STRING,
acc_num STRING,
password STRING,
citizen_id STRING,
bank_acc STRING,
) PARTITIONED BY (acc_level STRING, reg_date DATE);
user_info2的子目录将是这样的:
......
.../doub_partition_user_info/acc_level=A/reg_date=20121024
.../doub_partition_user_info/acc_level=A/reg_date=20110101
......
.../doub_partition_user_info/acc_level=B/reg_date=20080214
......
SELECT * FROM user_info WHERE acc_level ='A' AND reg_date='20121024';
CREATE TABLE table_name (column_name column_type, ...) PARTITIONED BY RANGE (partition_key_name, partition_key_type, ...) (PARTITION [partition_name] VALUES LESS THAN (partition_value1), PARTITION [partition_name] VALUES LESS THAN (partition_value2), ... PARTITION [partition_name] VALUES LESS THAN (MAXVALUE))范围分区时,每个分区对应分区键的一个区间。凡是落在指定区间内的记录都会被放入对应的分区下。各个分区之间按顺序排列,前一个分区的最大值即为后一个分区的最小值,第一个分区的最小值为该字段类型所允许的最小值,关键词MAXVALUE代表该字段类型所允许的最大值,一般最后一个分区会用MAXVALUE包住所有其他可能的值
... partition A0200701 values less than ('200701')
tablespace USR_PMS_TBS
pctfree 0
initrans 1
maxtrans 255
storage
(
initial 8M
next 1M
minextents 1
maxextents unlimited
) ...
Inceptor可以识别从第二行开始的所有语法,但是不会做任何处理,只是不报语法错误。
[$host] transwarp> CREATE TABLE range_partition_user_info (
name STRING,
acc_num STRING,
password STRING,
citizen_id STRING,
bank_acc STRING,
acc_level string)
PARTITIONED BY RANGE (reg_date string) (
PARTITION VALUES LESS THAN (20090000),
PARTITION VALUES LESS THAN (20100000),
PARTITION VALUES LESS THAN (20110000),
PARTITION VALUES LESS THAN (20120000),
PARTITION VALUES LESS THAN (20130000),
PARTITION VALUES LESS THAN (20140000),
PARTITION VALUES LESS THAN (MAXVALUE));
然后向表内通过INSERT INTO...SELECT...FROM...向表内插入数据:
[$host] transwarp> INSERT INTO TABLE range_partition_user_info partition (reg_date) SELECT name, acc_num, password, citizen_id, bank_acc, acc_level, reg_date FROM user_info; [$host] transwarp> SELECT * FROM range_partition_user_info; 管淑艳 2394923 783438 330683198005210864 99913863445174 C 20141003 邱坤 0700735 737297 340811199211252278 14388242322818 A 20121024 李平 8725869 600709 460100198902070313 43081307046984 E 20130702 马从筠 6513065 115591 140400198711012307 96080357291141 A 20110101 潘营泽 6600641 990590 511521198705077435 48471135593608 C 20110430 李韩瑶 2755506 015859 310230197912126559 42412396242237 D 20110916 华微 5224133 531547 420529198911075631 32638281095907 B 20080214 宁新瑶 4580952 986634 420822199001119507 97711008856576 D 20081031 祝韩恒 6670192 205239 230801197908126178 73790369990971 C 20100101 魏向卉 3912384 841242 522632199301029404 68537153578048 A 20091202
CREATE TABLE t1 (value INT) partitioned by range(id1 INT, id2 INT, id3 INT) ( partition values less than (5, 105, 205), partition values less than (5, 105, 215), partition values less than (5, 115, 205), partition values less than (5, 115, 215), partition values less than (5, 115, MAXVALUE), partition p10_105_205 values less than (10, 105, 205), partition p10_105_215 values less than (10, 105, 215), partition p10_115_205 values less than (10, 115, 205), partition p10_115_215 values less than (10, 115, 215), partition pall_max values less than (MAXVALUE, MAXVALUE, MAXVALUE) );