资讯详情

presto连接kudu建表与查询方法

使用presto连接kudu查询引擎,在kudu增删改查

Apache Kudu 不支持模式,即表的命名空间。连接器可以通过表命名协议模拟

在默认情况下,禁用模式模拟。在这种情况下,所有 Kudu 表都是default架构的一部分。

例如, 目录和模式分别设置为和的,orders可以在 Presto 中查询名为 的 Kudu 表。SELECT * FROM kudu.default.orders、SELECT * FROM orders。

可以包含表名 Kudu 在这种情况下,请使用双引号。例如,查询名称为special.table!use的 Kudu 表。SELECT * FROM kudu.default."special.table!"

  • 在默认架构中创建用户表
CREATE TABLE kudu.default.users (  user_id int WITH (primary_key = true) , first_name varchar, last_name varchar  )  WITH (  partition_by_hash_columns = ARRAY['user_id'] , partition_by_hash_buckets = 2  );

在创建 Kudu 在表中,您必须/可以指定相关列的主键、编码和压缩以及散列或范围分区的附加信息。

  • 可使用此表
DESCRIBE kudu.default.users;
  • 插入一些数据
INSERT INTO kudu.default.users VALUES (1, 'Donald', 'Duck'), (2, 'Mickey', 'Mouse');
  • 选择插入的数据
SELECT * FROM kudu.default.users;

在连接器属性中使用模式模拟,即etc/catalog/kudu.properties,将表映射到模式中,按照一些协议。

  • 使用kudu.schema-emulation.enabled=true和kudu.schema-emulation.prefix=,如下:

Kudu 表名

Presto 限定名称

orders

kudu.default.orders

part1.part2

kudu.part1.part2

x.y.z

kudu.x."y.z"

由于 Kudu 不直接支持模式,$schemas因此,创建了一个名为特殊表管理模式。

  • 使用kudu.schema-emulation.enabled=true和kudu.schema-emulation.prefix=presto::,如下:

Kudu 表名

Presto 限定名称

orders

kudu.default.orders

part1.part2

kudu.default."part1.part2"

x.y.z

kudu.default."x.y.z"

presto::part1.part2

kudu.part1.part2

presto:x.y.z

kudu.x."y.z"

由于 Kudu 不直接支持模式,presto::$schemas因此,创建了一种特殊的表来管理模式。

注:使用presto执行create table...as...语句到kudu时,varchar\VARBINARY最大长度会丢失,date类型会被转化成字符串

Presto Data Type

Kudu Data Type

Comment

BOOLEAN

BOOL

TINYINT

INT8

SMALLINT

INT16

INTEGER

INT32

BIGINT

INT64

REAL

FLOAT

DOUBLE

DOUBLE

VARCHAR

STRING

see1

VARBINARY

BINARY

see1

TIMESTAMP

UNIXTIME_MICROS

μs resolution in Kudu column is reduced to ms resolution

DECIMAL

DECIMAL

only supported for Kudu server >= 1.7.0

CHAR

not supported

DATE

not supported2

TIME

not supported

JSON

not supported

TIMEWITHTIMEZONE

not supported

TIMESTAMPWITHTIMEZONE

not supported

INTERVALYAR TO MO NTH

not supported

INTERVAL DAY TO SEC OND

not supported

ARRAY

not supported

MAP

not supported

IPADDRESS

not supported

Presto SQL statement

Comment

SELECT

INSERT INTO ... VALUES

Behaves like upsert

INSERT INTO ... SELECT ...

Behaves like upsert

DELETE

CREATE SCHEMA

Only allowed, if schema emulation is enabled

DROP SCHEMA

Only allowed, if schema emulation is enabled

CREATE TABLE

See Create Table

CREATE TABLE ... AS

DROP TABLE

ALTER TABLE ... RENAME TO ...

ALTER TABLE ... RENAME COLUMN ...

Only allowed, if not part of primary key

ALTER TABLE ... ADD COLUMN ...

See Add Column

ALTER TABLE ... DROP COLUMN ...

Only allowed, if not part of primary key

SHOW SCHEMAS

SHOW TABLES

SHOW CREATE TABLE

SHOW COLUMNS FROM

DESCRIBE

Same as SHOW COLUMNS FROM

CALL kudu.system.add_range_partition

Adds range partition to a table. See Managing range partitions

CALL kudu.system.drop_range_partition

Drops a range partition from a table. See Managing range partitions

注:ALTER SCHEMA ... RENAME TO ...不支持

创建表时需要提供字段与字段类型之外,kudu还需要分区信息,可选择设置字段编码与压缩方式。

CREATE TABLE user_events ( 
user_id int WITH (primary_key = true)
, event_name varchar WITH (primary_key = true)
, message varchar
, details varchar WITH (nullable = true, encoding = 'plain') 
) 
WITH ( 
partition_by_hash_columns = ARRAY['user_id']
, partition_by_hash_buckets = 5
, number_of_replicas = 3 
);

主键由user_id和组成event_name,表被列的哈希值划分为五个分区user_id,并且number_of_replicas显式设置为 3。

主键列必须始终是列列表的第一列。分区中使用的所有列都必须是主键的一部分。

表属性number_of_replicas是可选的。它定义了 tablet 副本的数量,并且必须是奇数。如果未指定,则使用 Kudu 主配置中的默认复制因子。

Kudu 支持两种不同的分区:哈希分区和范围分区。散列分区按散列值将行分布到多个桶之一中。范围分区使用完全有序的范围分区键分布行。必须明确创建具体的范围分区。Kudu 还支持多级分区。一张表必须至少有一个分区(散列或范围)。它最多可以有一个范围分区,但可以有多个散列分区“级别”。

除了列名和类型之外,您还可以指定列的更多属性。

列属性名称

类型

描述

primary_key

BOOLEAN

如果true,该列属于主键列。Kudu 主键强制执行唯一性约束。插入具有相同主键的第二行会导致更新现有行 ('UPSERT')。另请参阅Kudu 文档中的主键设计。

nullable

BOOLEAN

如果true,该值可以为空。主键列不能为空。

encoding

VARCHAR

列编码有助于节省存储空间并提高查询性能。如果未指定,Kudu 根据列类型使用自动编码。有效值为: 'auto'、'plain'、'bitshuffle'、 'runlength'、'prefix'、'dictionary'、 'group_varint'。另请参阅Kudu 文档中的列编码。

compression

VARCHAR

可以压缩编码的列值。如果未指定,Kudu 使用默认压缩。有效值为: 'default'、'no'、'lz4'、'snappy'、 'zlib'。另请参阅Kudu 文档中的列压缩。

例子

CREATE TABLE mytable ( 
name varchar WITH (primary_key = true
, encoding = 'dictionary', compression = 'snappy')
, index bigint WITH (nullable = true, encoding = 'runlength', compression = 'lz4')
, comment varchar WITH (nullable = true, encoding = 'plain', compression = 'default')
, ... ) 
WITH (
...
);

一张表必须至少有一个分区(散列或范围)。它最多可以有一个范围分区,但可以有多个散列分区“级别”。有关更多详细信息,请参阅 Apache Kudu 文档:分区

如果在 Presto 中创建 Kudu 表,分区设计由几个表属性给出。

您可以为第一个哈希分区组提供两个表属性:的partition_by_hash_columns列(多个)属于分区组和定义partition_by_hash_buckets的分区的数目分割所述散列值的范围之中。所有分区列都必须是主键的一部分。

CREATE TABLE mytable ( 
col1 varchar WITH (primary_key=true)
, col2 varchar WITH (primary_key=true), ... 
) 
WITH ( 
partition_by_hash_columns = ARRAY['col1', 'col2']
, partition_by_hash_buckets = 4 
)

这定义了具有列的散列分区col1并col2 分布在 4 个分区上。

要定义两个单独的散列分区组,还可以使用名为partition_by_second_hash_columns和 的第二对表属性partition_by_second_hash_buckets。

CREATE TABLE mytable ( 
col1 varchar WITH (primary_key=true)
, col2 varchar WITH (primary_key=true), ... 
) 
WITH ( 
partition_by_hash_columns = ARRAY['col1']
, partition_by_hash_buckets = 2
, partition_by_second_hash_columns = ARRAY['col2']
, partition_by_second_hash_buckets = 3 
)

这定义了一个两级散列分区,第一个散列分区组col1分布在 2 个桶上的列上,第二个散列分区组col2分布在 3 个桶上的列上。因此,您的表有 2 x 3 = 6 个分区。

您最多可以在 Apache Kudu 中提供一个范围分区。列是用 table 属性定义的partition_by_range_columns。范围本身range_partitions在创建表时的表属性中给出。或作为替代,程序kudu.system.add_range_partition和 kudu.system.drop_range_partition可用于管理范围划分为现有的表。

例子:

CREATE TABLE events ( 
rack varchar WITH (primary_key=true)
, machine varchar WITH (primary_key=true)
, event_time timestamp WITH (primary_key=true)
, ... 
) 
WITH ( 
partition_by_hash_columns = ARRAY['rack']
, partition_by_hash_buckets = 2
, partition_by_second_hash_columns = ARRAY['machine']
, partition_by_second_hash_buckets = 3
, partition_by_range_columns = ARRAY['event_time']
, range_partitions = '[{"lower": null, "upper": "2018-01-01T00:00:00"}
, {"lower": "2018-01-01T00:00:00", "upper": null}]' )

这定义了具有两个散列分区组和event_time列上的一个范围分区的树级分区。创建了两个范围分区,并在“2018-01-01T00:00:00”处进行了拆分。

使用range_partitionstable 属性指定要创建的具体范围分区。范围分区定义本身必须在表属性中partition_design单独给出。

CREATE TABLE events ( 
serialno varchar WITH (primary_key = true)
, event_time timestamp WITH (primary_key = true)
, message varchar 
) 
WITH ( 
partition_by_hash_columns = ARRAY['serialno']
, partition_by_hash_buckets = 4
, partition_by_range_columns = ARRAY['event_time']
, range_partitions = '[{"lower": null, "upper": "2017-01-01T00:00:00"}
    , {"lower": "2017-01-01T00:00:00", "upper": "2017-07-01T00:00:00"}
    , {"lower": "2017-07-01T00:00:00", "upper": "2018-01-01T00:00:00"}]' 
);

这将创建一个表,在列上有一个散列分区,serialno有 4 个桶,在列上进行范围分区event_time。另外创建了三个范围分区:

  • 对于 2017 年之前的所有 event_times(下限 =null表示未绑定)
  • 2017年上半年
  • 2017年下半年

这意味着任何尝试添加event_time2018 年或更大年份的行都将失败,因为没有定义分区。下一节将展示如何为现有表定义新的范围分区。

对于现有表,有添加和删除范围分区的过程。

  • 添加范围分区
CALL kudu.system.add_range_partition(<schema>, <table>, <range_partition_as_json_string>),
  • 删除范围分区
CALL kudu.system.drop_range_partition(<schema>, <table>, <range_partition_as_json_string>)
  • <schema>: 表的模式
  • <table>: 表名
  • <range_partition_as_json_string>: 范围分区的下限和上限作为 json 字符串的形式 ,或者如果范围分区有多个列: . 下限和上限值的具体文字取决于列类型。'{"lower": <value>, "upper": <value>}''{"lower": [<value_col1>,...], "upper": [<value_col1>,...]}'

Presto 数据类型

JSON 字符串示例

BIGINT

‘{“lower”: 0, “upper”: 1000000}’

SMALLINT

‘{“lower”: 10, “upper”: null}’

VARCHAR

‘{“lower”: “A”, “upper”: “M”}’

TIMESTAMP

‘{“lower”: “2018-02-01T00:00:00.000”, “upper”: “2018-02-01T12:00:00.000”}’

BOOLEAN

‘{“lower”: false, “upper”: true}’

VARBINARY

编码为 base64 字符串的值

要指定无界边界,请使用 value null。

CALL kudu.system.add_range_partition('myschema', 'events', '{"lower": "2018-01-01", "upper": "2018-06-01"}')

这将为events架构中 的表添加一个范围分区,myschema具有下限2018-01-01(更准确地说 2018-01-01T00:00:00.000)和上限2018-07-01。

使用 sql 语句查询现有范围分区(它们显示在表属性中 )。SHOW CREATE TABLE

向现有表添加列使用 SQL 语句。您可以指定与创建表时相同的列属性。ALTER TABLE ... ADD COLUMN ...

ALTER TABLE mytable ADD COLUMN extraInfo varchar WITH (nullable = true, encoding = 'plain')

  • Kudu 中仅支持小写表名和列名

本文链接:Kudu Connector — Presto 0.265.1 Documentation

标签: 插座连接器dc060t00

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台