我是靠谱客的博主 坚强康乃馨,最近开发中收集的这篇文章主要介绍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时,varcharVARBINARY最大长度会丢失,date类型会被转化成字符串

Presto Data Type

Kudu Data Type

Comment

BOOLEAN

BOOL

TINYINT

INT8

SMALLINT

INT16

INTEGER

INT32

BIGINT

INT64

REAL

FLOAT

DOUBLE

DOUBLE

VARCHAR

STRING

see 1

VARBINARY

BINARY

see 1

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 supported 2

TIME

not supported

JSON

not supported

TIME WITH TIMEZONE

not supported

TIMESTAMP WITH TIME ZONE

not supported

INTERVAL YEAR TO MO NTH

not supported

INTERVAL DAY TO SEC OND

not supported

ARRAY

not supported

MAP

not supported

IPADDRESS

not supported

presto支持的语法

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 ...不支持

Create Table

创建表时需要提供字段与字段类型之外,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_partitions

使用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

最后

以上就是坚强康乃馨为你收集整理的presto连接kudu建表与查询方法的全部内容,希望文章能够帮你解决presto连接kudu建表与查询方法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部