Kudu 連接器¶
Kudu 連接器允許在 Apache Kudu 中查詢、插入和刪除資料
相容性¶
此連接器與所有 1.0 開始的 Apache Kudu 版本相容。
如果連接器使用目標伺服器上無法使用的功能,將會傳回錯誤。目前使用 Apache Kudu 1.8.0 進行測試。
組態¶
若要設定 Kudu 連接器,請建立一個目錄屬性檔案 etc/catalog/kudu.properties
,並包含以下內容,並視需要替換屬性
connector.name=kudu ## List of Kudu master addresses, at least one is needed (comma separated) ## Supported formats: example.com, example.com:7051, 192.0.2.1, 192.0.2.1:7051, ## [2001:db8::1], [2001:db8::1]:7051, 2001:db8::1 kudu.client.master-addresses=localhost ## Kudu does not support schemas, but the connector can emulate them optionally. ## By default, this feature is disabled, and all tables belong to the default schema. ## For more details see connector documentation. #kudu.schema-emulation.enabled=false ## Prefix to use for schema emulation (only relevant if `kudu.schema-emulation.enabled=true`) ## The standard prefix is `presto::`. Empty prefix is also supported. ## For more details see connector documentation. #kudu.schema-emulation.prefix= ####################### ### Advanced Kudu Java client configuration ####################### ## Default timeout used for administrative operations (e.g. createTable, deleteTable, etc.) #kudu.client.default-admin-operation-timeout = 30s ## Default timeout used for user operations #kudu.client.default-operation-timeout = 30s ## Default timeout to use when waiting on data from a socket #kudu.client.default-socket-read-timeout = 10s ## Disable Kudu client's collection of statistics. #kudu.client.disable-statistics = false
查詢資料¶
Apache Kudu 不支援架構,也就是表格的命名空間。此連接器可以選擇性地透過表格命名慣例來模擬架構。
預設行為(不使用架構模擬)¶
架構模擬預設為停用。在這種情況下,所有 Kudu 表格都屬於 default
架構。
例如,名為 orders
的 Kudu 表格可以在 Presto 中使用 SELECT * FROM kudu.default.orders
進行查詢,或者如果目錄和架構分別設定為 kudu
和 default
,則可以使用簡單的 SELECT * FROM orders
。
表格名稱可以在 Kudu 中包含任何字元。在這種情況下,請使用雙引號。例如,若要查詢名為 special.table!
的 Kudu 表格,請使用 SELECT * FROM kudu.default."special.table!"
。
範例¶
在預設架構中建立一個 users 表格,使用
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;
您應該會得到類似的結果
Column | Type | Extra | Comment
------------+---------+-------------------------------------------------+---------
user_id | integer | primary_key, encoding=auto, compression=default |
first_name | varchar | nullable, encoding=auto, compression=default |
last_name | varchar | nullable, encoding=auto, compression=default |
(3 rows)
使用以下方式插入一些資料
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 和 Kudu 的資料類型會盡可能地對應
Presto 資料類型 |
Kudu 資料類型 |
註解 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
請參閱 [1] |
|
|
請參閱 [1] |
|
|
Kudu 欄中的 µs 解析度會降低為 ms 解析度 |
|
|
僅支援 Kudu 伺服器 >= 1.7.0 |
|
- |
不支援 |
|
- |
不支援 [2] |
|
- |
不支援 |
|
- |
不支援 |
|
- |
不支援 |
|
- |
不支援 |
|
- |
不支援 |
|
- |
不支援 |
|
- |
不支援 |
|
- |
不支援 |
|
- |
不支援 |
支援的 Presto SQL 語句¶
Presto SQL 語句 |
註解 |
---|---|
|
|
|
行為類似於 |
|
行為類似於 |
|
|
|
僅在啟用架構模擬時允許 |
|
僅在啟用架構模擬時允許 |
|
請參閱 建立表格 |
|
|
|
|
|
|
|
僅在不是主鍵的一部分時允許 |
|
請參閱 新增欄 |
|
僅在不是主鍵的一部分時允許 |
|
|
|
|
|
|
|
|
|
與 |
|
為資料表新增範圍分割區。請參閱管理範圍分割區 |
|
從資料表刪除範圍分割區。請參閱管理範圍分割區 |
不支援 ALTER SCHEMA ... RENAME TO ...
。
建立資料表¶
在建立 Kudu 資料表時,您當然需要提供欄位及其類型,但 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
是可選的。它定義了平板複本的數量,並且必須是一個奇數。如果未指定,則會使用 Kudu 主設定中的預設複寫因數。
Kudu 支援兩種不同的分割區類型:雜湊分割區和範圍分割區。雜湊分割區會根據雜湊值將資料列分配到多個儲存桶中。範圍分割區則使用完全排序的範圍分割區鍵來分配資料列。具體的範圍分割區必須明確建立。Kudu 也支援多層級分割區。一個資料表必須至少有一個分割區(雜湊或範圍)。它可以最多有一個範圍分割區,但可以有多個雜湊分割區「層級」。
更多詳細資訊,請參閱分割區設計。
欄位屬性¶
除了欄位名稱和類型之外,您還可以指定欄位的其他屬性。
欄位屬性名稱 |
類型 |
描述 |
---|---|---|
|
|
如果 |
|
|
如果 |
|
|
欄位編碼有助於節省儲存空間並提高查詢效能。如果未指定,Kudu 會根據欄位類型使用自動編碼。有效值為: |
|
|
可以壓縮編碼後的欄位值。如果未指定,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 中最多可以提供一個範圍分割區。欄位使用資料表屬性 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_partitions
資料表屬性,您可以指定要建立的具體範圍分割區。範圍分割區定義本身必須在資料表屬性 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_time(下限 =
null
表示未綁定)適用於 2017 年上半年
適用於 2017 年下半年
這表示嘗試加入 event_time
為 2018 年或更高的資料列將會失敗,因為沒有定義分割區。下一節說明如何為現有資料表定義新的範圍分割區。
管理範圍分割區¶
對於現有資料表,可以使用程序來新增和刪除範圍分割區。
新增範圍分割區
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 字串編碼
若要指定未綁定的界限,請使用值
null
。
範例
CALL kudu.system.add_range_partition('myschema', 'events', '{"lower": "2018-01-01", "upper": "2018-06-01"}')
這將為綱要 myschema
中的資料表 events
新增一個範圍分割區,下限為 2018-01-01
(更準確地說,是 2018-01-01T00:00:00.000
),上限為 2018-07-01
。
使用 SQL 語句 SHOW CREATE TABLE
查詢現有的範圍分割區(它們會顯示在資料表屬性 range_partitions
中)。
新增欄位¶
若要將欄位新增到現有資料表,請使用 SQL 語句 ALTER TABLE ... ADD COLUMN ...
。您可以指定與建立資料表時相同的欄位屬性。
範例
ALTER TABLE mytable ADD COLUMN extraInfo varchar WITH (nullable = true, encoding = 'plain')
另請參閱欄位屬性。
已知限制¶
僅支援 Kudu 中的小寫資料表和欄位名稱
尚未測試使用受保護的 Kudu 叢集。