Iceberg カタログは、StarRocks がバージョン 2.4 からサポートしている外部カタログです。
背景情報
Iceberg カタログを使用すると、次のことが可能になります:
テーブルを手動で作成することなく、Iceberg カタログを介して Iceberg のデータを直接クエリできます。
INSERT INTO または非同期マテリアライズドビュー (v2.5 以降で利用可能) を使用して、Iceberg から StarRocks にデータを処理、モデリング、インポートできます。
StarRocks から Iceberg のデータベースとテーブルを作成または削除できます。また、INSERT INTO を使用して、StarRocks テーブルから Parquet 形式の Iceberg テーブルにデータを書き込むこともできます (v3.1 以降で利用可能)。
Iceberg のデータに適切にアクセスするには、StarRocks クラスターが Iceberg クラスターのストレージシステムとメタデータサービスにアクセスできる必要があります。StarRocks は現在、以下のストレージシステムとメタデータサービスをサポートしています:
Hadoop 分散ファイルシステム (HDFS) または Alibaba Cloud Object Storage Service (OSS)。
メタデータサービス。現在サポートされているメタデータサービスには、Hive Metastore (HMS) および Data Lake Formation (DLF) 1.0 (レガシー) が含まれます。
注意事項
StarRocks から Iceberg データをクエリする場合は、次の点にご注意ください。
ファイル形式 | 圧縮形式 | Iceberg テーブルバージョン |
Parquet | SNAPPY、LZ4、ZSTD、GZIP、および NO_COMPRESSION |
|
ORC | ZLIB、SNAPPY、LZO、LZ4、ZSTD、および NO_COMPRESSION |
|
Iceberg カタログの作成
構文
CREATE EXTERNAL CATALOG <catalog_name>
[COMMENT <comment>]
PROPERTIES
(
"type" = "iceberg",
MetastoreParams
)パラメーター
パラメーターは、Iceberg が使用するメタデータサービスによって異なります。
HMS の使用
catalog_name:Iceberg カタログの名前。このパラメーターは必須です。名前は以下の要件を満たす必要があります:英字 (a-z または A-Z)、数字 (0-9)、またはアンダースコア (_) で構成され、先頭は英字である必要があります。
全長は 64 文字を超えることはできません。
カタログ名では大文字と小文字が区別されます。
comment:Iceberg カタログの説明。このパラメーターはオプションです。type:データソースのタイプ。これをicebergに設定します。MetastoreParams:StarRocks が Iceberg クラスターのメタデータサービスにアクセスするためのパラメーター。プロパティ
説明
iceberg.catalog.type
Iceberg のカタログのタイプ。値は
hiveである必要があります。hive.metastore.uris
Hive Metastore の URI。フォーマットは
thrift://<ip_address_of_hive_metastore>:<port>です。デフォルトのポートは 9083 です。
DLF 1.0 (レガシー) の使用
catalog_name:Iceberg カタログの名前。このパラメーターは必須です。名前は以下の要件を満たす必要があります:英字 (a-z または A-Z)、数字 (0-9)、またはアンダースコア (_) で構成され、先頭は英字である必要があります。
全長は 64 文字を超えることはできません。
カタログ名では大文字と小文字が区別されます。
comment:Iceberg カタログの説明。このパラメーターはオプションです。type:データソースのタイプ。これをicebergに設定します。MetastoreParams:StarRocks が Iceberg クラスターのメタデータサービスにアクセスするためのパラメーター。プロパティ
説明
iceberg.catalog.type
Iceberg のカタログのタイプ。値は
dlfである必要があります。dlf.catalog.id
DLF 内の既存のデータカタログの ID。
dlf.catalog.idパラメーターを設定しない場合、システムはデフォルトの DLF カタログを使用します。
DLF の使用
DLF を使用する場合、設定済みの Resource Access Management (RAM) ユーザーを使用して StarRocks Manager で操作を実行する必要があります。詳細については、「DLF カタログの使用」をご参照ください。
catalog_name:Iceberg カタログの名前。このパラメーターは必須です。名前は以下の要件を満たす必要があります:先頭は英字で、英字 (a-z または A-Z)、数字 (0-9)、およびアンダースコア (_) のみを含むことができます。
長さは 64 文字を超えることはできません。
comment:Iceberg カタログの説明。このパラメーターはオプションです。type:データソースのタイプ。これをicebergに設定します。CatalogParams:StarRocks が Iceberg クラスターのメタデータにアクセスするためのパラメーター。パラメーター設定は、Iceberg クラスターが使用するメタデータのタイプによって異なります。パラメーター
必須
説明
<catalog_name>はい
DLF データカタログの名前。例:
dlf_catalog。typeはい
カタログのタイプ。Iceberg データソースの場合、固定値
icebergを入力します。uriはい
DLF の REST API アドレス。フォーマットは
http://<VPC_Endpoint>/icebergです。<VPC_Endpoint>は、指定されたリージョンにおける DLF の VPC エンドポイントです。具体的な値については、「サービスエンドポイント」をご参照ください。
例:http://cn-hangzhou-vpc.dlf.aliyuncs.com/iceberg。iceberg.catalog.typeはい
Iceberg カタログのタイプ。DLF シナリオの場合、固定値
dlf_restを入力します。warehouseはい
Iceberg カタログの名前。Data Lake Formation コンソールの データカタログ ページから取得できます。
rest.signing-regionはい
DLF サービスの
リージョン ID。例:cn-hangzhou。
例
次の例では、iceberg_catalog_hms という名前の Iceberg カタログを作成します。
HMS の使用
CREATE EXTERNAL CATALOG iceberg_catalog_hms
PROPERTIES
(
"type" = "iceberg",
"iceberg.catalog.type" = "hive",
"hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083"
);DLF 1.0 (レガシー) の使用
CREATE EXTERNAL CATALOG iceberg_catalog_hms
PROPERTIES
(
"type" = "iceberg",
"iceberg.catalog.type" = "dlf",
"dlf.catalog.id" = "sr_dlf"
);DLF の使用
CREATE EXTERNAL CATALOG iceberg_catalog
properties
(
"type" = "iceberg",
"iceberg.catalog.type" = "dlf_rest",
"uri" = "http://cn-hangzhou-vpc.dlf.aliyuncs.com/iceberg",
"warehouse" = "iceberg_test",
"rest.signing-region" = "cn-hangzhou"
);Iceberg カタログの表示
SHOW CATALOGS を実行して、現在の StarRocks クラスター内のすべてのカタログをクエリできます。
SHOW CATALOGS;また、SHOW CREATE CATALOG を実行して、外部カタログの作成文を表示することもできます。たとえば、次のコマンドを実行して、Iceberg カタログ iceberg_catalog_hms の作成文を表示します。
SHOW CREATE CATALOG iceberg_catalog_hms;Iceberg データベースの作成
StarRocks の内部カタログと同様に、Iceberg カタログに対する CREATE DATABASE 権限がある場合、CREATE DATABASE を使用してそのカタログにデータベースを作成できます。この機能は v3.1 から利用可能です。
GRANT 文と REVOKE 文を使用して、ユーザーとロールの権限を付与および取り消すことができます。
構文
対象の Iceberg カタログに切り替えてから、次の文を実行して Iceberg データベースを作成します。
CREATE DATABASE <database_name>
[PROPERTIES ("location" = "<prefix>://<path_to_database>/<database_name.db>/")]パラメーター
location パラメーターは、データベースのファイルパスを指定します。HDFS と Alibaba Cloud OSS をサポートしています:
ストレージシステムとして HDFS を使用する場合、
Prefixをhdfsに設定します。ストレージシステムとして Alibaba Cloud OSS を使用する場合、
Prefixをossに設定します。
location パラメーターを指定しない場合、StarRocks は現在の Iceberg カタログのデフォルトパスにデータベースを作成します。
Iceberg カタログとデータベースの切り替え
次の方法で、対象の Iceberg カタログとデータベースに切り替えることができます:
まず、
SET CATALOGを使用して現在のセッションの Iceberg カタログを指定し、次に USE を使用してデータベースを指定します。-- 現在のセッションのアクティブなカタログを切り替えます。 SET CATALOG <catalog_name>; -- 現在のセッションのアクティブなデータベースを指定します。 USE <db_name>;USE を実行して、セッションを対象の Iceberg カタログ内の特定のデータベースに直接切り替えます。
USE <catalog_name>.<db_name>;
Iceberg データベースの削除
StarRocks の内部データベースと同様に、Iceberg データベースに対する DROP 権限がある場合、DROP DATABASE を使用してそれを削除できます。この機能は v3.1 から利用可能で、空のデータベースの削除のみをサポートしています。
GRANT 文と REVOKE 文を使用して、ユーザーとロールの権限を付与および取り消すことができます。
データベースの削除操作では、HDFS または OSS 上の対応するファイルパスは削除されません。対象の Iceberg カタログに切り替えてから、次の文を実行して Iceberg データベースを削除します。
DROP DATABASE <database_name>;Iceberg カタログの削除
DROP CATALOG を実行して、外部カタログを削除できます。たとえば、次のコマンドを実行して iceberg_catalog_hms を削除します。
DROP Catalog iceberg_catalog_hms;Iceberg テーブルの作成
StarRocks の内部データベースと同様に、Iceberg データベースに対する CREATE TABLE 権限がある場合、CREATE TABLE または CREATE TABLE AS SELECT (CTAS) を使用してそのデータベースにテーブルを作成できます。この機能は v3.1 から利用可能です。対象の Iceberg カタログとデータベースに切り替えてから、次の構文を実行して Iceberg テーブルを作成します。
構文
CREATE TABLE [IF NOT EXISTS] [database.]table_name
(column_definition1[, column_definition2, ...
partition_column_definition1,partition_column_definition2...])
[partition_desc]
[PROPERTIES ("key" = "value", ...)]
[AS SELECT query]パラメーター
column_definition
column_definitionの構文は次のとおりです。col_name col_type [COMMENT 'comment']パラメーターは次の表で説明されています。
パラメーター
説明
col_name列の名前。
col_type列のデータの型。
現在サポートされているデータの型は、TINYINT、SMALLINT、INT、BIGINT、FLOAT、DOUBLE、DECIMAL、DATE、DATETIME、CHAR、VARCHAR[(length)]、ARRAY、MAP、および STRUCT です。
LARGEINT、HLL、および BITMAP 型はサポートされていません。
説明すべての非パーティションキー列のデフォルト値は
NULLです。パーティションキー列は列リストの最後に宣言する必要があり、NULLにすることはできません。partition_desc
partition_descの構文は次のとおりです。PARTITION BY (par_col1[, par_col2...])現在、StarRocks は ID 変換のみをサポートしています。これは、一意のパーティション値ごとにパーティションが作成されることを意味します。
説明パーティションキー列は列リストの最後に宣言する必要があります。FLOAT、DOUBLE、DECIMAL、または DATETIME 以外のデータの型をサポートしています。NULL 値はサポートされていません。
PROPERTIES
PROPERTIES句で、"key"="value"形式で Iceberg テーブルのプロパティを宣言できます。詳細については、Iceberg テーブルのプロパティをご参照ください。次の表に、いくつかの一般的なプロパティを示します。プロパティ
説明
location
Iceberg テーブルのファイルパス。メタデータサービスとして HMS を使用する場合、
locationパラメーターを指定する必要はありません。file_format
Iceberg テーブルのファイル形式。現在、Parquet 形式のみがサポートされています。デフォルト:
parquet。compression_codec
Iceberg テーブルの圧縮形式。サポートされている形式は SNAPPY、GZIP、ZSTD、および LZ4 です。デフォルト値:
gzip。このプロパティはバージョン 3.2.3 以降非推奨になりました。このバージョン以降、Iceberg テーブルへの書き込みの圧縮アルゴリズムは、connector_sink_compression_codecセッション変数によって一元的に制御されます。
例
idとscore列を含む非パーティションテーブルunpartition_tblを作成します。CREATE TABLE unpartition_tbl ( id int, score double );action、id、およびdt列を含むパーティションテーブルpartition_tbl_1を作成し、idとdtをパーティションキー列として定義します。CREATE TABLE partition_tbl_1 ( action varchar(20), id int NOT NULL, dt date NOT NULL ) PARTITION BY (id,dt);ソーステーブル
partition_tbl_1からデータをクエリし、クエリ結果に基づいてパーティションテーブルpartition_tbl_2を作成します。idとdtをpartition_tbl_2のパーティションキー列として定義します。CREATE TABLE partition_tbl_2 PARTITION BY (id, dt) AS SELECT * from partition_tbl_1;
Iceberg テーブルスキーマの表示
次の方法で Iceberg テーブルのスキーマを表示できます。
テーブルスキーマを表示します。
DESC[RIBE] <catalog_name>.<database_name>.<table_name>;CREATE コマンドからテーブルスキーマとテーブルファイルのストレージ場所を表示します。
SHOW CREATE TABLE <catalog_name>.<database_name>.<table_name>;
Iceberg テーブルへのデータ挿入
StarRocks の内部テーブルと同様に、Iceberg テーブルに対する INSERT 権限がある場合、INSERT を使用して StarRocks テーブルからその Iceberg テーブルにデータを書き込むことができます。現在、Parquet 形式の Iceberg テーブルにのみデータを書き込むことができます。この機能は v3.1 から利用可能です。
GRANT 文と REVOKE 文を使用して、ユーザーとロールの権限を付与および取り消すことができます。
対象の Iceberg カタログとデータベースに切り替えてから、次の構文を実行して StarRocks テーブルから Parquet 形式の Iceberg テーブルにデータを書き込みます。
構文
INSERT {INTO | OVERWRITE} <table_name>
[ (column_name [, ...]) ]
{ VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }
-- 指定されたパーティションにデータを書き込みます。
INSERT {INTO | OVERWRITE} <table_name>
PARTITION (par_col1=<value> [, par_col2=<value>...])
{ VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }パーティションキー列は NULL にすることはできません。したがって、データロード中にパーティションキー列に値があることを確認する必要があります。
パラメーター
パラメーター | 説明 |
INTO | 対象テーブルにデータを追加します。 |
OVERWRITE | 対象テーブルのデータを上書きします。 |
column_name | インポートの対象列。1 つ以上の列を指定できます。複数の列を指定する場合は、カンマ ( |
expression | 対応する列に値を割り当てるために使用される式。 |
DEFAULT | 対応する列にデフォルト値を割り当てます。 |
query | クエリ文。クエリの結果が対象テーブルにロードされます。クエリ文は、StarRocks がサポートする任意の SQL クエリ構文をサポートします。 |
PARTITION | データロードの対象パーティション。対象テーブルのすべてのパーティションキー列を指定する必要があります。指定されたパーティションキー列の順序は、テーブル作成時に定義された順序と異なっていてもかまいません。パーティションを指定する場合、 |
例
以下の書き込み文は、デフォルトの Parquet 形式を例として使用しています。
partition_tbl_1テーブルに次の 3 行のデータを挿入します。INSERT INTO partition_tbl_1 VALUES ("buy", 1, "2023-09-01"), ("sell", 2, "2023-09-02"), ("buy", 3, "2023-09-03");単純な計算を含む SELECT クエリの結果データを、指定された列の順序で
partition_tbl_1テーブルに挿入します。INSERT INTO partition_tbl_1 (id, action, dt) SELECT 1+1, 'buy', '2023-09-03';partition_tbl_1テーブル自体からデータを読み取る SELECT クエリの結果データを挿入します。INSERT INTO partition_tbl_1 SELECT 'buy', 1, date_add(dt, INTERVAL 2 DAY) FROM partition_tbl_1 WHERE id=1;SELECT クエリの結果データを、
partition_tbl_2テーブルのdt='2023-09-01'かつid=1のパーティションに挿入します。方法 1
INSERT INTO partition_tbl_2 SELECT 'order', 1, '2023-09-01';方法 2
INSERT INTO partition_tbl_2 partition(dt='2023-09-01',id=1) SELECT 'order';
partition_tbl_1テーブルのdt='2023-09-01'かつid=1のパーティションで、action列のすべての値をcloseで上書きします:方法 1
INSERT OVERWRITE partition_tbl_1 SELECT 'close', 1, '2023-09-01';方法 2
INSERT OVERWRITE partition_tbl_1 partition(dt='2023-09-01',id=1) SELECT 'close';
Iceberg テーブルからのデータクエリ
SHOW DATABASES を実行して、指定されたカタログに属する Iceberg クラスター内のデータベースを表示します。
SHOW DATABASES FROM <catalog_name>;対象の Iceberg カタログとデータベースに切り替えます。
SELECT を実行して、対象データベース内の対象テーブルをクエリします。
SELECT count(*) FROM <table_name> LIMIT 10;
Iceberg テーブルの削除
StarRocks の内部テーブルと同様に、Iceberg テーブルに対する DROP 権限がある場合、DROP TABLE を使用してそれを削除できます。この機能は v3.1 から利用可能です。
GRANT 文と REVOKE 文を使用して、ユーザーとロールの権限を付与および取り消すことができます。
テーブルの削除操作では、HDFS または OSS 上の対応するファイルパスとデータは削除されません。FORCE キーワードを追加して実行される強制削除は、HDFS または OSS 上のデータを削除しますが、対応するファイルパスは削除しません。対象の Iceberg カタログとデータベースに切り替えてから、次の文を実行して Iceberg テーブルを削除します。
DROP TABLE <table_name> FORCE;関連ドキュメント
Iceberg の詳細については、「概要」をご参照ください。