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 進行查詢,或者如果目錄和架構分別設定為 kududefault,則可以使用簡單的 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=truekudu.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=truekudu.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 資料類型

註解

BOOLEAN

BOOL

TINYINT

INT8

SMALLINT

INT16

INTEGER

INT32

BIGINT

INT64

REAL

FLOAT

DOUBLE

DOUBLE

VARCHAR

STRING

請參閱 [1]

VARBINARY

BINARY

請參閱 [1]

TIMESTAMP

UNIXTIME_MICROS

Kudu 欄中的 µs 解析度會降低為 ms 解析度

DECIMAL

DECIMAL

僅支援 Kudu 伺服器 >= 1.7.0

CHAR

-

不支援

DATE

-

不支援 [2]

TIME

-

不支援

JSON

-

不支援

TIME WITH TIMEZONE

-

不支援

TIMESTAMP WITH TIME ZONE

-

不支援

INTERVAL YEAR TO MO NTH

-

不支援

INTERVAL DAY TO SEC OND

-

不支援

ARRAY

-

不支援

MAP

-

不支援

IPADDRESS

-

不支援

支援的 Presto SQL 語句

Presto SQL 語句

註解

SELECT

INSERT INTO ... VALUES

行為類似於 upsert

INSERT INTO ... SELECT ...

行為類似於 upsert

DELETE

CREATE SCHEMA

僅在啟用架構模擬時允許

DROP SCHEMA

僅在啟用架構模擬時允許

CREATE TABLE

請參閱 建立表格

CREATE TABLE ... AS

DROP TABLE

ALTER TABLE ... RENAME TO ...

ALTER TABLE ... RENAME COLUMN ...

僅在不是主鍵的一部分時允許

ALTER TABLE ... ADD COLUMN ...

請參閱 新增欄

ALTER TABLE ... DROP COLUMN ...

僅在不是主鍵的一部分時允許

SHOW SCHEMAS

SHOW TABLES

SHOW CREATE TABLE

SHOW COLUMNS FROM

DESCRIBE

SHOW COLUMNS FROM 相同

CALL kudu.system.add_range_partition

為資料表新增範圍分割區。請參閱管理範圍分割區

CALL kudu.system.drop_range_partition

從資料表刪除範圍分割區。請參閱管理範圍分割區

不支援 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_idevent_name 組成,資料表透過欄位 user_id 的雜湊值分割成五個分割區,並且 number_of_replicas 明確設定為 3。

主鍵欄位必須始終是欄位列表中的第一個欄位。所有在分割區中使用的欄位都必須是主鍵的一部分。

資料表屬性 number_of_replicas 是可選的。它定義了平板複本的數量,並且必須是一個奇數。如果未指定,則會使用 Kudu 主設定中的預設複寫因數。

Kudu 支援兩種不同的分割區類型:雜湊分割區和範圍分割區。雜湊分割區會根據雜湊值將資料列分配到多個儲存桶中。範圍分割區則使用完全排序的範圍分割區鍵來分配資料列。具體的範圍分割區必須明確建立。Kudu 也支援多層級分割區。一個資料表必須至少有一個分割區(雜湊或範圍)。它可以最多有一個範圍分割區,但可以有多個雜湊分割區「層級」。

更多詳細資訊,請參閱分割區設計

欄位屬性

除了欄位名稱和類型之外,您還可以指定欄位的其他屬性。

欄位屬性名稱

類型

描述

primary_key

BOOLEAN

如果 true,則欄位屬於主鍵欄位。Kudu 主鍵強制執行唯一性約束。插入具有相同主鍵的第二個資料列會導致更新現有的資料列(「UPSERT」)。另請參閱 Kudu 文件中的主鍵設計

nullable

BOOLEAN

如果 true,則值可以為 null。主鍵欄位不能為 null。

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
)

這定義了一個雜湊分割區,其欄位為 col1col2,分佈在 4 個分割區中。

若要定義兩個單獨的雜湊分割區群組,請同時使用第二對名為 partition_by_second_hash_columnspartition_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_partitionkudu.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 上的範圍分割區。此外,還建立了三個範圍分割區

  1. 適用於 2017 年之前的所有 event_time(下限 = null 表示未綁定)

  2. 適用於 2017 年上半年

  3. 適用於 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 叢集。