Kudu 基本操作,详细操作讲解

          kudu与Apache Impala紧密集成,允许您使用Impala使用Impala的SQL语法从Kudu平板中插入、查询、更新和删除数据,以替代使用Kudu API来构建自定义的Kudu应用程序。此外,您还可以使用JDBC或ODBC将使用任何语言、框架或商业智能工具编写的现有或新应用程序连接到Kudu数据,使用Impala作为代理。

 

内部和外部Impala表

使用Impala创建新的Kudu表时,可以将表创建为内部表或外部表。

内部

一个内部表由Impala管理,当您从Impala中删除它时,数据和表确实会被删除。使用Impala创建新表时,它通常是内部表。

外部

外部表(由CREATE EXTERNAL TABLE)不是由Impala管理的,删除这样的表不会从它的源位置(这里是Kudu)删除该表。相反,它只删除了Impala和Kudu之间的映射。这是Kudu提供的语法中用于将现有表映射到Impala的模式。

Impala文件有关内部表和外部表的详细信息。

在Impala中查询现有的Kudu表

通过KuduAPI或其他集成创建的表(如ApacheSPark)在Impala中不会自动可见。要查询它们,您必须首先在Impala中创建一个外部表,以便将Kudu表映射到Impala数据库中:

CREATE EXTERNAL TABLE my_mapping_table
STORED AS KUDU
TBLPROPERTIES (
  'kudu.table_name' = 'my_kudu_table'
);

从Impala中创建一个新的Kudu表

CREATE TABLE my_first_table
(
  id BIGINT,
  name STRING,
  PRIMARY KEY(id)
)
PARTITION BY HASH PARTITIONS 16
STORED AS KUDU;

 

CREATE TABLE语句中,必须首先列出构成主键的列。此外,主键列被隐式标记。NOT NULL.

默认情况下,通过Impala创建的Kudu表使用Tablet复制因子3,如下所示,其中n是要使用的复制因子,复制因子必须是奇数。:

TBLPROPERTIES ('kudu.num_tablet_replicas' = 'n')

注:使用ALTER TABLE更改 kudu.num_Tablet_Copicas 表属性目前没有任何效果。

指定表分区

        每个表分为由一个或多个表服务器提供的表。理想情况下, tablets should split a table’s data 平等地拆分表的数据。Kudu目前没有自动(或手动)拆分预先存在的 tablet的机制。在实现此功能之前,您必须在创建表时指定分区。在设计表格架构时,请考虑使用主键,您可以将表格分割成以相似速率增长的分区。PARTITION BY使用Impala创建表时,可以使用子句指定分区:
 

Impala关键字,如group,在没有在关键字意义上使用时,用反勾号  `  字符括起来。

 

CREATE TABLE cust_behavior (
  _id BIGINT PRIMARY KEY,
  salary STRING,
  edu_level INT,
  usergender STRING,
  `group` STRING,
  city STRING,
  postcode STRING,
  last_purchase_price FLOAT,
  last_purchase_date BIGINT,
  category STRING,
  sku STRING,
  rating INT,
  fulfilled_date BIGINT
)
PARTITION BY RANGE (_id)
(
    PARTITION VALUES < 1439560049342,
    PARTITION 1439560049342 <= VALUES < 1439566253755,
    PARTITION 1439566253755 <= VALUES < 1439572458168,
    PARTITION 1439572458168 <= VALUES < 1439578662581,
    PARTITION 1439578662581 <= VALUES < 1439584866994,
    PARTITION 1439584866994 <= VALUES < 1439591071407,
    PARTITION 1439591071407 <= VALUES
)
STORED AS KUDU;

如果有多个主键列,则可以使用元组语法指定分区界限:('va',1), ('ab',2),表达式必须是有效的JSON。

 

Impala数据库和Kudu

每个Impala表都包含在一个名为数据库..默认数据库称为default,用户可以根据需要创建和删除其他数据库。

当从Impala内部创建托管kudu表时,相应的kudu表将被命名为my_database::table_name.

Kudu表不支持Impala关键字

创建Kudu表时不支持下列Impala关键字:PARTITIONED - LOCATION - ROWFORMAT

优化SQL谓词的性能

如果WHERE子句包括与运算符的比较。=<=, '\<', '\>', >=BETWEEN,或IN,Kudu直接评估条件,只返回相关结果。这提供了最佳的性能,因为Kudu只向Impala返回相关的结果。用于谓词!=LIKE或Impala支持的任何其他谓词类型,Kudu不直接计算谓词,而是将所有结果返回Impala,并依赖Impala计算其余谓词并相应地过滤结果。这可能会导致性能上的差异,这取决于评估之前和之后的结果集的增量。WHERE条款。

分区表

根据主键列上的分区模式,将表划分为平板。每个平板电脑至少由一个平板服务器提供服务。理想情况下,表应该被分割成平板,这些平板电脑分布在多个平板服务器上,以最大限度地实现并行操作。您使用的分区架构的详细信息将完全取决于您存储的数据类型以及如何访问它。有关Kudu模式设计的完整讨论,请参见Schema Design.

在创建表之后,kudu目前没有拆分或合并平板电脑的机制。创建表时,必须为其提供分区架构。在设计表时,请考虑使用主键,这将允许您将表划分为以类似速度增长的平板电脑。

您可以使用Impala的PARTITION BY关键字,它支持RANGEHASH..分区方案可以包含零或多个。HASH定义,后面是可选的RANGE定义。这个RANGE定义可以引用一个或多个主键列。例basicadvanced分区如下所示。

 

PARTITION BY RANGE

可以为一个或多个主键列指定范围分区。Kudu中的范围分区允许根据所选分区键的特定值或值范围分割表。这允许您在写操作中平衡并行性和扫描效率。

假设您有一个有列的表statename,和purchase_count..下面的示例创建50台平板电脑,每个美国州一台。

 

单调递增值

如果在值单调增加的列上按范围进行分区,那么最后一块平板将比其他平板大得多。此外,插入的所有数据都将一次写入单个平板,从而限制了数据摄入的可伸缩性。在这种情况下,考虑按HASH而不是,或除了,RANGE.

CREATE TABLE customers (
  state STRING,
  name STRING,
  purchase_count int,
  PRIMARY KEY (state, name)
)
PARTITION BY RANGE (state)
(
  PARTITION VALUE = 'al',
  PARTITION VALUE = 'ak',
  PARTITION VALUE = 'ar',
  -- ... etc ...
  PARTITION VALUE = 'wv',
  PARTITION VALUE = 'wy'
)
STORED AS KUDU;

PARTITION BY HASH

您可以通过散列将其分发到特定数量的“桶”中,而不是通过显式范围或与范围分布相结合的方式分发。您可以指定要分区的主键列,以及要使用的桶数。行是通过散列指定的键列来分布的。假设被散列的值本身没有显着的倾斜,这将有助于在桶之间均匀地分布数据。

可以指定多个定义,也可以指定使用复合主键的定义。但是,不能在多个散列定义中提及一列。考虑两列,ab: *  HASH(a)HASH(b) *  HASH(a,b) *  HASH(a), HASH(a,b)

 PARTITION BY HASH没有指定列是通过散列所有主键列来创建所需数量的桶的快捷方式。

如果主键值在其域中分布均匀,并且没有明显的数据倾斜(例如时间戳或串行ID),则哈希分区是一种合理的方法。

下面的示例通过散列idsku柱子。这在所有16台平板电脑上都有传播。在本例中,对sku值可能需要读取所有16块平板电脑,因此这可能不是此表的最佳模式。看见高级分区作为一个扩展的例子。

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;

更多参考官网:https://kudu.apache.org/docs/kudu_impala_integration.html#_specifying_tablet_partitioning

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值