使用Impala shell
默认impala-shell连接localhost 21000
如果要练一个不同的主机(host) 使用 -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.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'