Kudu建表操作
使用Impala shell
输入impala-shell,即可进入impala-shell环境,impala-shell默认连接localhost:21000
如果要连接一个不同的主机(host) ,请使用使用impala-shell -i 主机名:端口号
如果要退出impala shell,请使用 quit 命令
内部表与外部表
内部表:由Impala控制,当你使用Impala删除这个表的时候,这个表的数据和表格是被真正的删除了。一般创立新的表都是内部表。
外部表:不受Impala控制,当你使用Impala删除这个表的时候,他并不会从Kudu原地址删除表,而是移除了Impala和Kudu的Mapping
创建一个Kudu table
Impala会先创建一个table,然后创建mapping
1.某个字段为主键那么它必须要在建表语句前面
2.创建一个表,你需要具体化一个分配方案,如何分配参见《Partitioning Rules of Thumb 》
Partitioning Tables
1.前面介绍到,Kudu的表被水平分割成很多块,每一个块称为Tablet。
kudu表tables,会根据 主键列分割模式 分割成tablets,理想的情况下,一个table应该被均匀的分配成tablets实现最大化并行操作。
Basic Partitioning:
PARTITION BY HASH:
通过hash,将tablets分布在具体数量的“buckets”
举个例子:
CREATE TABLE cust_behavior ( id BIGINT, sku STRING, salary STRING, edu_level INT, usergender STRING, `group` STRING, city STRING, postcode STRING, last_purchase_price FLOAT, last_purchase_date BIGINT, category STRING, rating INT, fulfilled_date BIGINT, PRIMARY KEY (id, sku) ) PARTITION BY HASH PARTITIONS 16 STORED AS KUDU;
这个例子,通过哈希id和sku,创建了16个tablets,如果要查询sku列的部分值,可能需要读16个tablets。这可能不是最佳的分法。
PARTITION BY RANGE:
Range partitioning in Kudu allows splitting a table based on specific values or ranges of values of the chosen partition keys. This allows you to balance parallelism in writes with scan efficiency.
分区遵循的经验原则
如果是事实表:请尽可能多的利用集群中的电脑。如果是维度表:确保每一个tablet有1GB的大小
Insert Data
batch insert
我们一般使用SELECT FROM 语法导入数据
INSERT INTO my_kudu_table
SELECT * FROM legacy_data_import_table;
主键唯一性冲突
在大多数关系型数据库中,如果你插入一个曾经被插入过的行,插入操作会失败这是因为主键会重复。
Impala不会让这项 query失败,它会产生一个警告,然后执行剩下的操作。
如果插入的行命中注定会替代过去存在的行,使用Upsert 替代 Insert
INSERT INTO my_first_table VALUES (99, "sarah"); UPSERT INTO my_first_table VALUES (99, "zoe"); -- the current value of the row is 'zoe'