Kuduコネクタを使用すると、Kuduテーブルのデータのクエリ、データの挿入、およびデータの削除を実行できます。
背景情報
このトピックでは、Kuduコネクタと実行できる操作に関する以下の情報について説明します。
前提条件
Kuduサービスを含むHadoopクラスタとTrinoクラスタが作成されていること。詳細については、「クラスタの作成」をご参照ください。
制限事項
Kuduコネクタを使用して接続できるのは、Kudu 1.10以降のみです。
TrinoクラスタとHadoopクラスタ間にネットワーク接続を確立する必要があります。
Kuduテーブルと列の名前には、小文字のみを使用できます。
Kuduコネクタの構成の変更
Kuduコネクタの構成を変更できます。詳細については、「コネクタの構成」をご参照ください。
E-MapReduce(EMR)コンソールにログインし、Trinoサービスページの [構成] タブに移動します。 [構成] タブで、[kudu.properties] をクリックします。ビジネス要件に基づいて、次の表に示す構成項目を変更または追加します。
構成項目 | 説明 |
kudu.client.master-addresses | Kuduマスターアドレス。複数のKuduマスターアドレスを構成する場合は、アドレスをカンマ(,)で区切ります。 次のアドレス形式がサポートされています。example.com、example.com:7051、192.0.2.1、192.0.2.1:7051、[2001:db8::1]、[2001:db8::1]:7051、および 2001:db8::1。 デフォルト値:localhost。 説明 Kuduテーブルへのデータの書き込みとデータのクエリを実行できるようにするには、デフォルト値 localhost をKuduクラスタのマスターノードのIPアドレスまたはホスト名に変更します。例:master-1-1。 |
kudu.schema-emulation.enabled | スキーマエミュレーション機能を有効にするかどうかを指定します。有効な値:
重要 [kudu.properties] タブで [構成項目の追加] をクリックして、この構成項目を追加できます。構成項目の追加方法の詳細については、「構成項目の追加」をご参照ください。 |
kudu.schema-emulation.prefix | スキーマエミュレーション機能のプレフィックス。 重要
標準のプレフィックスは |
kudu.client.default-admin-operation-timeout | テーブルの作成や削除などの管理操作のデフォルトのタイムアウト期間。 デフォルト値:30。単位:秒。 |
kudu.client.default-operation-timeout | ユーザー操作のデフォルトのタイムアウト期間。 デフォルト値:30。単位:秒。 |
kudu.client.default-socket-read-timeout | ソケットからのデータを待機するデフォルトのタイムアウト期間。 デフォルト値:10。単位:秒。 |
kudu.client.disable-statistics | Kuduクライアントが統計情報を収集できるようにするかどうかを指定します。有効な値:
|
データのクエリ
Apache Kuduはスキーマをサポートしていません。ただし、スキーマをエミュレートするようにKuduコネクタを構成できます。
スキーマエミュレーション無効(デフォルト)
デフォルトでは、スキーマエミュレーション機能は無効になっています。この場合、すべてのKuduテーブルは default スキーマに存在します。
たとえば、SELECT * FROM kudu.default.orders ステートメントを実行して、orders テーブルからデータをクエリできます。 kudu をカタログとして、default をスキーマとして指定すると、SELECT * FROM orders ステートメントを実行して orders テーブルからデータをクエリできます。
Kuduテーブルの名前には、任意の文字を含めることができます。テーブル名に特殊文字が含まれている場合は、名前を二重引用符(")で囲む必要があります。たとえば、special.table! テーブルからデータをクエリするには、SELECT * FROM kudu.default."special.table!" ステートメントを実行します。
例:
usersという名前のテーブルをdefaultスキーマに作成します。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 ); // プライマリキー、列のエンコード形式または圧縮形式、ハッシュパーティションまたは範囲パーティションなど、必要なテーブル情報を指定する必要があります。説明テーブルを作成するときは、プライマリキー、列のエンコード形式または圧縮形式、ハッシュパーティションまたは範囲パーティションなど、必要なテーブル情報を指定する必要があります。
テーブルに関する情報を表示します。
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コネクタの kudu.properties 構成ファイルでスキーマエミュレーション機能を有効にすると、Kuduテーブルは命名規則に基づいてスキーマにマッピングされます。
kudu.schema-emulation.enabled=trueとkudu.schema-emulation.prefix=を構成すると、次の表にリストされているマッピングが優先されます。Kuduテーブル名
Prestoテーブル名
orderskudu.default.orderspart1.part2kudu.part1.part2x.y.zkudu.x."y.z"説明Kuduはスキーマをサポートしていません。Prestoは、スキーマを管理するために
$schemasという名前の特別なテーブルを作成します。kudu.schema-emulation.enabled=trueとkudu.schema-emulation.prefix=presto::を構成すると、次の表にリストされているマッピングが優先されます。Kuduテーブル名
Prestoテーブル名
orderskudu.default.orderspart1.part2kudu.default."part1.part2"x.y.zkudu.default."x.y.z"presto::part1.part2kudu.part1.part2presto::x.y.zkudu.x."y.z"説明Kuduはスキーマをサポートしていません。Prestoは、スキーマを管理するために
presto::$schemasという名前の特別なテーブルを作成します。
データ型マッピング
次の表に、Prestoデータ型とKuduデータ型のマッピングを示します。
Prestoデータ型 | Kuduデータ型 | 備考 |
BOOLEAN | BOOL | なし。 |
INT8 | なし。 | |
INT16 | なし。 | |
INT32 | なし。 | |
INT64 | なし。 | |
FLOAT | なし。 | |
DOUBLE | なし。 | |
VARCHAR | STRING |
|
BINARY | なし。 | |
TIMESTAMP | UNIXTIME_MICROS | このデータ型のKudu列の精度は、µsからmsに低下します。 |
DECIMAL | DECIMAL | このデータ型は、バージョン 1.7.0 以降のKuduサーバーでのみサポートされています。 |
DATE | N/A | Kuduには、このデータ型に一致するデータ型がありません。
|
CHAR | N/A | Kuduには、このデータ型に一致するデータ型がありません。 |
Kuduには、このデータ型に一致するデータ型がありません。 | ||
Kuduには、このデータ型に一致するデータ型がありません。 | ||
Kuduには、このデータ型に一致するデータ型がありません。 | ||
Kuduには、このデータ型に一致するデータ型がありません。 | ||
Kuduには、このデータ型に一致するデータ型がありません。 | ||
Kuduには、このデータ型に一致するデータ型がありません。 | ||
Kuduには、このデータ型に一致するデータ型がありません。 | ||
Kuduには、このデータ型に一致するデータ型がありません。 | ||
Kuduには、このデータ型に一致するデータ型がありません。 |
サポートされているPresto SQLステートメント
ALTER SCHEMA ... RENAME TO ... ステートメントはサポートされていません。
ステートメント | 備考 |
| なし。 |
| なし。 |
| なし。 |
| なし。 |
| このステートメントは、スキーマエミュレーションが有効になっている場合にのみサポートされます。 |
| このステートメントは、スキーマエミュレーションが有効になっている場合にのみサポートされます。 |
| テーブルの作成方法については、「テーブルの作成」をご参照ください。 |
| なし。 |
| なし。 |
| なし。 |
| 列の追加方法については、「列の追加」をご参照ください。 |
| これらのステートメントは、名前変更または削除する列がプライマリキー列でない場合にのみサポートされます。 |
| これらのステートメントは、名前変更または削除する列がプライマリキー列でない場合にのみサポートされます。|
| なし。 |
| なし。 |
| なし。 |
| なし。 |
| このステートメントは |
| このステートメントは、範囲パーティションを追加するために使用されます。詳細については、「範囲パーティション」をご参照ください。 |
| このステートメントは、範囲パーティションを削除するために使用されます。詳細については、「範囲パーティション」をご参照ください。 |
テーブルの作成
テーブルを作成するときは、列、データ型、およびパーティション情報を指定する必要があります。ビジネス要件に基づいて、列のエンコード形式または圧縮形式を指定することもできます。例:
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 列のハッシュ値に基づいて 5 つのパーティションに分割されます。 number_of_replicas の値は 3 です。
CREATE TABLEステートメントのパラメータを構成する場合は、次の項目に注意してください。
プライマリキー列は他の列の前に指定する必要があり、プライマリキー列のみをパーティションキー列として構成できます。
number_of_replicasパラメータはオプションです。このパラメータは、タブレットレプリカの数を指定し、奇数に設定する必要があります。このパラメータを構成しない場合は、Kuduマスター構成のデフォルトのレプリケーション係数が使用されます。Kuduは、ハッシュパーティションと範囲パーティションをサポートしています。ハッシュパーティションは、ハッシュ値によって行を多数のバケットのいずれかに分散します。範囲パーティションは、順序付けられた範囲パーティションキーを使用して行を分散します。範囲パーティションは明示的に作成する必要があります。Kuduは複数レベルのパーティション分割をサポートしています。テーブルには、少なくとも 1 つのハッシュパーティションまたは範囲パーティションが含まれている必要があります。テーブルには、範囲パーティションは 1 つだけ含めることができますが、ハッシュパーティションは複数含めることができます。
列プロパティ
列名とデータ型に加えて、他の列プロパティも指定できます。
列プロパティ | データ型 | 説明 |
primary_key | BOOLEAN | このパラメータがtrueに設定されている場合、列はプライマリキー列として使用されます。 Kuduプライマリキーは、一意性制約を強制します。既存の行と同じプライマリキー値を持つ行を挿入すると、既存の行が更新されます。詳細については、「プライマリキー設計」を参照してください。 |
nullable | BOOLEAN | このプロパティをtrueに設定すると、列にnull値を含めることができます。 重要 プライマリキー列にはnull値を含めることができません。 |
encoding | VARCHAR | ストレージスペースを節約し、クエリのパフォーマンスを向上させるために、列のエンコード形式を指定します。 このプロパティを構成しない場合、Kuduは列データ型に基づいて列のデータをエンコードします。有効な値:auto、plain、bitshuffle、runlength、prefix、dictionary、および group_varint。詳細については、「列のエンコード」を参照してください。 |
compression | VARCHAR | 列の圧縮形式を指定します。 このパラメータを構成しない場合、Kuduはデフォルトの圧縮形式を使用します。有効な値:default、no、lz4、snappy、および zlib。詳細については、「列の圧縮」を参照してください。 |
例:
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 (...);
// col1とcol2の列はハッシュパーティションキー列として定義され、データは4つのパーティションに分散されます。
// この例では、2つのハッシュパーティショングループが定義されています。最初のハッシュパーティショングループでは、行はcol1列に基づいて2つのパーティションに分散されます。2番目のハッシュパーティショングループでは、行はcol2列に基づいて3つのパーティションに分散されます。この場合、テーブル内のパーティションの総数は6(2×3)です。
// この例では、2つのハッシュパーティショングループと1つの範囲パーティションが定義されています。テーブルはevent_timeフィールドで範囲パーティション化され、データは2018-01-01T00:00:00に基づいて分割されます。
// この例では、myschemaスキーマのeventsテーブルに範囲パーティションが追加されます。パーティションの下限は2018-01-01で、正確な値は2018-01-01T00:00:00.000です。パーティションの上限は2018-06-01です。
パーティション設計
テーブルには、範囲パーティションは 1 つだけ、またはハッシュパーティションは少なくとも 1 つ含めることができます。
ハッシュパーティションの定義
1 つのパーティショングループの定義
テーブルプロパティ 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 つのパーティションに分散されます。
2 つのパーティショングループの定義
2 つの独立したハッシュパーティショングループを定義する場合は、前の例で指定したテーブルプロパティに加えて、テーブルプロパティ
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 )説明この例では、2 つのハッシュパーティショングループが定義されています。最初のハッシュパーティショングループでは、行は col1 列に基づいて 2 つのパーティションに分散されます。2 番目のハッシュパーティショングループでは、行は col2 列に基づいて 3 つのパーティションに分散されます。この場合、テーブル内のパーティションの総数は 6(2 × 3)です。
範囲パーティションの定義
Kuduテーブルには、範囲パーティションを 1 つだけ含めることができます。これは、テーブルプロパティ
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}]' )説明この例では、2 つのハッシュパーティショングループと 1 つの範囲パーティションが定義されています。テーブルは
event_timeフィールドで範囲パーティション化され、データは2018-01-01T00:00:00に基づいて分割されます。範囲パーティションの管理
ストアドプロシージャを使用して、既存のテーブルに範囲パーティションを追加したり、既存のテーブルから範囲パーティションを削除したりできます。
例:
範囲パーティションの追加
CALL kudu.system.add_range_partition(<YOUR_SCHEMA_NAME>, <YOUR_TABLE_NAME>, <range_partition_as_json_string>)範囲パーティションの削除
CALL kudu.system.drop_range_partition(<YOUR_SCHEMA_NAME>, <YOUR_TABLE_NAME>, <range_partition_as_json_string>)
パラメータ
説明
<YOUR_SCHEMA_NAME>テーブルが属するスキーマ。
<YOUR_TABLE_NAME>テーブルの名前。
<range_partition_as_json_string>範囲パーティションの上限と下限。このパラメータは、
'{"lower": <value>, "upper": <value>}'JSON形式で構成する必要があります。パーティションに複数の列がある場合は、このパラメータを'{"lower": [<value_col1>,...], "upper": [<value_col1>,...]}'形式で構成する必要があります。上限と下限の具体的な値の形式は、列のデータ型によって異なります。データ型と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-06-01です。SHOW CREATE TABLEステートメントを実行して、テーブルの既存の範囲パーティションをクエリできます。返された結果では、テーブルプロパティrange_partitionsはテーブルのパーティション情報を示します。
列の追加
ALTER TABLE ... ADD COLUMN ... ステートメントを実行して、既存のテーブルに列を追加できます。列プロパティを使用して列を追加することもできます。列プロパティの詳細については、「テーブルの作成」をご参照ください。
ALTER TABLE mytable ADD COLUMN extraInfo varchar WITH (nullable = true, encoding = 'plain')