Hive カタログは、StarRocks が v2.3 からサポートしている外部カタログです。
背景
Hive カタログを使用すると、次のことが可能になります。
テーブルを手動で作成することなく、Hive データを直接クエリできます。
Hive データを処理およびモデル化し、INSERT INTO を使用して StarRocks にインポートしたり、v3.1 以降では非同期マテリアライズドビューを使用したりできます。
StarRocks で Hive のデータベースとテーブルを作成または削除できます。また、INSERT INTO を使用して、StarRocks テーブルから Hive テーブルに Parquet (v3.2 以降)、ORC、または TextFile (v3.3 以降) 形式でデータを書き込むこともできます。
Hive のデータにアクセスするには、StarRocks クラスターが Hive クラスターのストレージシステムとメタデータサービスにアクセスできる必要があります。StarRocks は現在、次のストレージシステムとメタデータサービスをサポートしています。
Hadoop 分散ファイルシステム (HDFS) または Alibaba Cloud Object Storage Service (OSS)。
メタデータサービス。現在サポートされているメタデータサービスには、Data Lake Formation DLF 1.0 (レガシー) と Hive Metastore (HMS) があります。
制限事項
StarRocks は、Parquet、ORC、TextFile、Avro、RCFile、および SequenceFile ファイル形式の Hive データのクエリをサポートしています。
Parquet ファイルは、SNAPPY、LZ4、ZSTD、GZIP、および NO_COMPRESSION 圧縮形式をサポートしています。LZO 圧縮形式のサポートは v3.1.5 で追加されました。
ORC ファイルは、ZLIB、SNAPPY、LZO、LZ4、ZSTD、および NO_COMPRESSION 圧縮形式をサポートしています。
TextFile ファイルは、v3.1.5 から LZO 圧縮形式をサポートしています。
StarRocks は、INTERVAL、BINARY、または UNION データ型の Hive データのクエリをサポートしていません。さらに、TextFile 形式の Hive テーブルの場合、StarRocks は MAP および STRUCT データ型をサポートしていません。
StarRocks は、Parquet (v3.2 以降)、ORC、および TextFile (v3.3 以降) ファイル形式での Hive へのデータ書き込みをサポートしています。
Parquet および ORC ファイルは、NO_COMPRESSION、SNAPPY、LZ4、ZSTD、および GZIP 圧縮形式をサポートしています。
TextFile は、NO_COMPRESSION 形式をサポートしています。
connector_sink_compression_codecシステム変数を使用して、Hive テーブルへの書き込みの圧縮アルゴリズムを設定できます。
Hive カタログの作成
構文
CREATE EXTERNAL CATALOG <catalog_name>
[COMMENT <comment>]
PROPERTIES
(
"type" = "hive",
GeneralParams,
MetastoreParams
)パラメーターの説明
パラメーターの構成は、Hive で使用されるメタデータサービスによって異なります。
HMS を使用する
catalog_name: Hive カタログの名前。このパラメーターは必須です。名前は次の要件を満たす必要があります。先頭は英字である必要があり、英字 (a-z または A-Z)、数字 (0-9)、およびアンダースコア (_) のみを含めることができます。
全長は 64 文字を超えることはできません。
comment: Hive カタログの説明。このパラメーターはオプションです。type: データソースのタイプ。これをhiveに設定します。GeneralParams: 一般設定用のパラメーターのセット。GeneralParamsには次のパラメーターが含まれます。パラメーター
必須
説明
enable_recursive_listing
いいえ
StarRocks がテーブルまたはパーティションディレクトリ内のファイルから、そのサブディレクトリを含めて再帰的にデータを読み取るかどうかを指定します。有効な値:
true (デフォルト): ディレクトリを再帰的に走査します。
false: テーブルまたはパーティションディレクトリの現在のレベルのファイルからのみデータを読み取ります。
MetastoreParams: StarRocks が Hive クラスターのメタデータにアクセスする方法に関連するパラメーター。プロパティ
説明
hive.metastore.type
メタストアのタイプ。デフォルト値は空で、Hive Metastore を使用することを意味します。
hive.metastore.uris
Hive Metastore の URI。フォーマットは
thrift://<IP_address_of_Hive_Metastore>:<port>です。デフォルトのポートは 9083 です。
DLF 1.0 (レガシー) を使用する
catalog_name: Hive カタログの名前。このパラメーターは必須です。名前は次の要件を満たす必要があります。先頭は英字である必要があり、英字 (a-z または A-Z)、数字 (0-9)、およびアンダースコア (_) のみを含めることができます。
全長は 64 文字を超えることはできません。
comment: Hive カタログの説明。このパラメーターはオプションです。type: データソースのタイプ。これをhiveに設定します。GeneralParams: 一般設定用のパラメーターのセット。GeneralParamsには次のパラメーターが含まれます。パラメーター
必須
説明
enable_recursive_listing
いいえ
StarRocks がテーブルまたはパーティションディレクトリ内のファイルから、そのサブディレクトリを含めて再帰的にデータを読み取るかどうかを指定します。有効な値:
true (デフォルト): ディレクトリを再帰的に走査します。
false: テーブルまたはパーティションディレクトリの現在のレベルのファイルからのみデータを読み取ります。
MetastoreParams: StarRocks が Hive クラスターのメタデータにアクセスする方法に関連するパラメーター。プロパティ
説明
hive.metastore.type
Hive で使用されるメタデータサービスのタイプ。これを
dlfに設定します。dlf.catalog.id
DLF 1.0 の既存のデータカタログの ID。このパラメーターは、
hive.metastore.typeがdlfに設定されている場合にのみ必須です。dlf.catalog.idパラメーターが指定されていない場合、システムはデフォルトの DLF カタログを使用します。
例
次の例では、ストレージに HDFS を使用し、hive_catalog という名前の Hive カタログを作成します。
HMS を使用する
CREATE EXTERNAL CATALOG hive_catalog
PROPERTIES
(
"type" = "hive",
"hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083"
);DLF 1.0 (レガシー) を使用する
CREATE EXTERNAL CATALOG hive_catalog
PROPERTIES
(
"type" = "hive",
"hive.metastore.type" = "dlf",
"dlf.catalog.id" = "sr_dlf"
);Hive カタログの表示
SHOW CATALOGS を使用して、現在の StarRocks クラスター内のすべてのカタログをクエリできます。
SHOW CATALOGS;SHOW CREATE CATALOG を使用して、外部カタログの作成文をクエリすることもできます。たとえば、次のコマンドを実行して、Hive カタログ hive_catalog の作成文をクエリします。
SHOW CREATE CATALOG hive_catalog;Hive カタログとデータベースの切り替え
次の方法で、ターゲットの Hive カタログとデータベースに切り替えることができます。
まず、
SET CATALOGで現在のセッションの Hive カタログを指定します。次に、USE でデータベースを指定します。-- Switch the catalog for the current session. SET CATALOG <catalog_name>; -- Specify the database for the current session. USE <db_name>;USE を使用して、セッションをターゲットの Hive カタログ配下の特定のデータベースに直接切り替えます。
USE <catalog_name>.<db_name>;
Hive カタログの削除
DROP CATALOG を使用して、外部カタログを削除できます。
たとえば、次のコマンドを実行して hive_catalog を削除します。
DROP Catalog hive_catalog;Hive データベースの作成
StarRocks 内部カタログと同様に、Hive カタログに対する CREATE DATABASE 権限がある場合、CREATE DATABASE 文を使用してそのカタログにデータベースを作成できます。この機能は v3.2 以降でサポートされています。
GRANT と REVOKE を使用して、ユーザーとロールに権限を付与および取り消すことができます。
構文
ターゲットの Hive カタログに切り替えて、次の文を実行して Hive データベースを作成します。
CREATE DATABASE <database_name>
[PROPERTIES ("location" = "<prefix>://<path_to_database>/<database_name.db>")]パラメーターの説明
データベースの作成時に location を指定しない場合、システムはデフォルトのパス <warehouse_location>/<database_name.db> を使用します。
location パラメーターは、データベースのファイルパスを指定します。HDFS と Object Storage Service (OSS) をサポートしています。
HDFS の場合、
Prefixをhdfsに設定します。Alibaba Cloud OSS または OSS-HDFS: 値を
ossに設定します。
Hive データベースの削除
StarRocks 内部データベースと同様に、Hive データベースに対する DROP 権限がある場合、DROP DATABASE を使用して削除できます。この機能は v3.2 以降でサポートされています。空のデータベースのみを削除できます。
GRANT と REVOKE を使用して、ユーザーとロールに権限を付与および取り消すことができます。
データベースの削除操作では、HDFS または Object Storage Service (OSS) 上の対応するファイルパスは削除されません。
ターゲットの Hive カタログに切り替えて、次の文を実行して Hive データベースを削除します。
DROP DATABASE <database_name>;Hive テーブルの作成
StarRocks 内部データベースと同様に、Hive データベースに対する CREATE TABLE 権限がある場合、CREATE TABLE、CREATE TABLE AS SELECT (CTAS)、または CREATE TABLE LIKE を使用して、そのデータベースに Managed Table を作成できます。
この機能は v3.2 以降でサポートされており、当初は Parquet 形式の Hive テーブルの作成のみをサポートしていました。v3.3 からは、ORC および TextFile 形式の Hive テーブルの作成もサポートしています。
ターゲットの Hive カタログとデータベースに切り替えてから、次の文を実行して Hive Managed Table を作成します。
構文
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]
[LIKE [database.]<source_table_name>]パラメーターの説明
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になります。これは、CREATE TABLE 文でDEFAULT "NULL"を指定するのと同じです。対照的に、パーティションキー列は最後に宣言する必要があり、NULLにすることはできません。partition_desc
partition_descの構文は次のとおりです。PARTITION BY (par_col1[, par_col2...])現在、StarRocks は ID 変換のみをサポートしています。これは、一意のパーティション値ごとにパーティションが作成されることを意味します。
説明パーティションキー列は最後に宣言する必要があります。FLOAT、DOUBLE、DECIMAL、または DATETIME 以外のデータ型をサポートし、NULL 値はサポートしません。さらに、partition_desc で宣言されたパーティションキー列の順序は、column_definition で定義された列の順序と一致している必要があります。
PROPERTIES
"key" = "value"形式を使用して、PROPERTIESで Hive テーブルのプロパティを宣言できます。次の表に、いくつかの一般的なプロパティを示します。プロパティ
説明
location
Managed Table のファイルパス。メタデータサービスとして HMS を使用する場合、
locationパラメーターを指定する必要はありません。file_format
Managed Table のファイル形式。現在、Parquet、ORC、および TextFile 形式がサポートされています。ORC および TextFile 形式は v3.3 からサポートされています。有効な値:
parquet、orc、textfile。デフォルト:parquet。compression_codec
Managed Table の圧縮形式。このプロパティは v3.2.3 から非推奨になりました。それ以降、Hive テーブルへの書き込みの圧縮アルゴリズムは、セッション変数 connector_sink_compression_codec によって制御されます。
例
次の CREATE TABLE 文は、デフォルトの Parquet 形式を例として使用しています。
idとscoreの 2 つの列を持つ非パーティションテーブルunpartition_tblを作成します。CREATE TABLE unpartition_tbl ( id int, score double );action、id、およびdtの 3 つの列を持つパーティションテーブル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;
Hive テーブルスキーマの表示
次の方法で Hive テーブルのスキーマを表示できます。
テーブルスキーマの表示
DESC[RIBE] <catalog_name>.<database_name>.<table_name>;CREATE コマンドからテーブルスキーマとファイルの場所を表示
SHOW CREATE TABLE <catalog_name>.<database_name>.<table_name>;
Hive テーブルデータの表示
方法 1: テーブルデータを直接クエリする
SELECT * FROM <catalog_name>.<database_name>.<table_name>;方法 2: 段階的に表示してクエリする
指定されたカタログに属する Hive クラスター内のデータベースを表示します。
SHOW DATABASES FROM <catalog_name>;ターゲットテーブルのデータをクエリします。
SELECT count(*) FROM <table_name> LIMIT 10;
Hive データのインポート
OLAP テーブル olap_tbl があると仮定します。このテーブルのデータを変換し、次のように StarRocks にインポートできます。
INSERT INTO default_catalog.olap_db.olap_tbl SELECT * FROM hive_table;Hive テーブルとビューへの権限の付与
GRANT を使用して、Hive カタログ内のすべてのテーブルとビューに対するクエリ権限をロールに付与できます。コマンドの構文は次のとおりです。
GRANT SELECT ON ALL TABLES IN ALL DATABASES TO ROLE <role_name>たとえば、次のコマンドを実行してロール hive_role_table を作成し、Hive カタログ hive_catalog に切り替えてから、hive_catalog 内のすべてのテーブルとビューに対するクエリ権限を hive_role_table に付与します。
-- Create the role hive_role_table.
CREATE ROLE hive_role_table;
-- Switch to the data catalog hive_catalog.
SET CATALOG hive_catalog;
-- Grant the query permission on all tables and views in hive_catalog to hive_role_table.
GRANT SELECT ON ALL TABLES IN ALL DATABASES TO ROLE hive_role_table;Hive テーブルへのデータ挿入
StarRocks 内部テーブルと同様に、Hive テーブル (Managed Table または External Table) に対する INSERT 権限がある場合、INSERT を使用して StarRocks テーブルからその Hive テーブルにデータを書き込むことができます。
この機能は v3.2 以降でサポートされており、当初は Parquet 形式の Hive テーブルへの書き込みのみをサポートしていました。v3.3 からは、ORC および TextFile 形式の Hive テーブルへの書き込みもサポートしています。
External Table にデータを書き込む機能はデフォルトで無効になっていることに注意してください。ENABLE_WRITE_HIVE_EXTERNAL_TABLE システム変数を使用して有効にする必要があります。
GRANT と REVOKE を使用して、ユーザーとロールに権限を付与および取り消すことができます。
connector_sink_compression_codec セッション変数を使用して、Hive テーブルへの書き込みの圧縮アルゴリズムを指定できます。
ターゲットの Hive カタログとデータベースに切り替えてから、次の構文を使用して StarRocks テーブルから Hive テーブルにデータを書き込みます。
構文
INSERT {INTO | OVERWRITE} <table_name>
[ (column_name [, ...]) ]
{ VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }
-- Write data to a specific partition.
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 | インポートのターゲットパーティション。ターゲットテーブルのすべてのパーティションキー列を指定する必要があります。指定されたパーティションキー列の順序は、テーブル作成時に定義された順序と異なっていてもかまいません。パーティションを指定する場合、列名 ( |
例
次の INSERT 文は、デフォルトの Parquet 形式を例として使用しています。
次の 3 行のデータをテーブル
partition_tbl_1に挿入します。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_1WHERE 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';
Hive テーブルの削除
StarRocks 内部テーブルと同様に、Hive テーブルに対する DROP 権限がある場合、DROP TABLE を使用して削除できます。この機能は v3.2 以降でサポートされています。現在、Hive Managed Table のみを削除できることに注意してください。
GRANT と REVOKE を使用して、ユーザーとロールに権限を付与および取り消すことができます。
テーブルを削除するには、DROP TABLE 文で FORCE キーワードを指定する必要があります。この操作は HDFS または Object Storage Service 上のテーブルデータを削除しますが、対応するファイルパスは削除しません。この操作は注意して実行してください。
ターゲットの Hive カタログとデータベースに切り替えてから、次の文を実行して Hive テーブルを削除します。
DROP TABLE <table_name> FORCEメタデータキャッシュの手動または自動更新
デフォルトでは、StarRocks は Hive メタデータをキャッシュし、クエリパフォーマンスを向上させるために非同期モードでキャッシュを自動的に更新します。Hive テーブルにスキーマの変更やその他の更新を行った場合、次のコマンドを使用してメタデータを手動で更新し、StarRocks が効率的なクエリプランを迅速に生成できるようにすることができます。
REFRESH EXTERNAL TABLE <table_name> [PARTITION ('partition_name', ...)]手動でのメタデータ更新は、次のような状況に適しています。
INSERT OVERWRITE ... PARTITION ...コマンドを実行した後など、既存のパーティション内のデータファイルが変更された場合。Hive テーブルのスキーマが変更された場合。
Hive テーブルが削除され、同じ名前の新しい Hive テーブルが作成された場合。
Hive カタログを作成する際に、
PROPERTIESで"enable_cache_list_names" = "true"を指定した場合。この場合、Hive 側で新しいパーティションが追加された後にクエリする必要があります。
v2.5.5 以降、StarRocks は Hive メタデータキャッシュの定期的なリフレッシュをサポートしています。この機能が有効な場合、Hive メタデータキャッシュはデフォルトで 10 分ごとに自動的にリフレッシュされます。ほとんどの場合、手動で更新する必要はありません。手動更新は、新しいパーティションを追加してそのデータをすぐにクエリする必要がある場合にのみ必要です。
REFRESH EXTERNAL TABLEは、FE にすでにキャッシュされているテーブルとパーティションのみを更新します。
参照
Hive の詳細については、「概要」をご参照ください。