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