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'

 

posted @ 2020-10-12 15:57  猫七的blog  阅读(177)  评论(0编辑  收藏  举报