概述
使用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建表与查询方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复