メインコンテンツまでスキップ
バージョン: 3.2

外部テーブル

注記
  • v3.0以降、Hive、Iceberg、Hudiからデータをクエリするために、catalogを使用することを推奨します。詳細は Hive catalogIceberg catalogHudi catalog を参照してください。

  • v3.1以降、MySQLとPostgreSQLからデータをクエリするために JDBC catalog を使用し、Elasticsearchからデータをクエリするために Elasticsearch catalog を使用することを推奨します。

  • 外部テーブル機能は、StarRocksにデータをロードするために設計されており、通常の操作として外部システムに対して効率的なクエリを実行するためのものではありません。より効率的な解決策は、データをStarRocksにロードすることです。

StarRocksは、外部テーブルを使用して他のデータソースにアクセスすることをサポートしています。外部テーブルは、他のデータソースに保存されているデータテーブルに基づいて作成されます。StarRocksはデータテーブルのメタデータのみを保存します。外部テーブルを使用して、他のデータソースのデータを直接クエリすることができます。StarRocksは以下のデータソースをサポートしています: MySQL、StarRocks、Elasticsearch、Apache Hive™、Apache Iceberg、Apache Hudi。現在、他のStarRocksクラスターから現在のStarRocksクラスターにデータを書き込むことのみが可能です。データを読み取ることはできません。StarRocks以外のデータソースからは、これらのデータソースからデータを読み取ることのみが可能です。

2.5以降、StarRocksは外部データソース上のホットデータクエリを高速化するData Cache機能を提供しています。詳細は Data Cache を参照してください。

StarRocks外部テーブル

StarRocks 1.19以降、StarRocksはStarRocks外部テーブルを使用して、あるStarRocksクラスターから別のクラスターにデータを書き込むことを可能にしています。これにより、読み書きの分離が実現され、リソースの分離が向上します。まず、宛先のStarRocksクラスターに宛先テーブルを作成します。次に、ソースのStarRocksクラスターで、宛先テーブルと同じスキーマを持つStarRocks外部テーブルを作成し、PROPERTIESフィールドに宛先クラスターとテーブルの情報を指定します。

データは、StarRocks外部テーブルにデータを書き込むためのINSERT INTOステートメントを使用して、ソースクラスターから宛先クラスターに書き込むことができます。これにより、以下の目標を実現できます:

  • StarRocksクラスター間のデータ同期。
  • 読み書きの分離。データはソースクラスターに書き込まれ、ソースクラスターからのデータ変更は宛先クラスターに同期され、クエリサービスを提供します。

以下のコードは、宛先テーブルと外部テーブルを作成する方法を示しています。

# 宛先のStarRocksクラスターに宛先テーブルを作成します。
CREATE TABLE t
(
k1 DATE,
k2 INT,
k3 SMALLINT,
k4 VARCHAR(2048),
k5 DATETIME
)
ENGINE=olap
DISTRIBUTED BY HASH(k1);

# ソースのStarRocksクラスターに外部テーブルを作成します。
CREATE EXTERNAL TABLE external_t
(
k1 DATE,
k2 INT,
k3 SMALLINT,
k4 VARCHAR(2048),
k5 DATETIME
)
ENGINE=olap
DISTRIBUTED BY HASH(k1)
PROPERTIES
(
"host" = "127.0.0.1",
"port" = "9020",
"user" = "user",
"password" = "passwd",
"database" = "db_test",
"table" = "t"
);

# ソースクラスターから宛先クラスターにデータを書き込むために、StarRocks外部テーブルにデータを書き込みます。2番目のステートメントは本番環境で推奨されます。
insert into external_t values ('2020-10-11', 1, 1, 'hello', '2020-10-11 10:00:00');
insert into external_t select * from other_table;

パラメータ:

  • EXTERNAL: このキーワードは、作成されるテーブルが外部テーブルであることを示します。

  • host: このパラメータは、宛先StarRocksクラスターのLeader FEノードのIPアドレスを指定します。

  • port: このパラメータは、宛先StarRocksクラスターのFEノードのRPCポートを指定します。

    注記

    StarRocks外部テーブルが属するソースクラスターが宛先StarRocksクラスターにアクセスできるようにするためには、ネットワークとファイアウォールを設定して、以下のポートへのアクセスを許可する必要があります:

    • FEノードのRPCポート。FE設定ファイル fe/fe.confrpc_port を参照してください。デフォルトのRPCポートは 9020 です。
    • BEノードのbRPCポート。BE設定ファイル be/be.confbrpc_port を参照してください。デフォルトのbRPCポートは 8060 です。
  • user: このパラメータは、宛先StarRocksクラスターにアクセスするために使用されるユーザー名を指定します。

  • password: このパラメータは、宛先StarRocksクラスターにアクセスするために使用されるパスワードを指定します。

  • database: このパラメータは、宛先テーブルが属するデータベースを指定します。

  • table: このパラメータは、宛先テーブルの名前を指定します。

StarRocks外部テーブルを使用する際の制限事項は以下の通りです:

  • StarRocks外部テーブルでは、INSERT INTOとSHOW CREATE TABLEコマンドのみを実行できます。他のデータ書き込み方法はサポートされていません。また、StarRocks外部テーブルからデータをクエリしたり、外部テーブルに対してDDL操作を行うことはできません。
  • 外部テーブルの作成構文は通常のテーブルの作成と同じですが、外部テーブルのカラム名やその他の情報は宛先テーブルと同じでなければなりません。
  • 外部テーブルは、宛先テーブルから10秒ごとにテーブルメタデータを同期します。宛先テーブルでDDL操作が行われた場合、2つのテーブル間でデータ同期に遅延が生じる可能性があります。

JDBC互換データベース用外部テーブル

v2.3.0以降、StarRocksはJDBC互換データベースをクエリするための外部テーブルを提供しています。これにより、データをStarRocksにインポートすることなく、これらのデータベースのデータを非常に高速に分析することができます。このセクションでは、StarRocksで外部テーブルを作成し、JDBC互換データベースのデータをクエリする方法について説明します。

前提条件

JDBC外部テーブルを使用してデータをクエリする前に、FEsとBEsがJDBCドライバのダウンロードURLにアクセスできることを確認してください。ダウンロードURLは、JDBCリソースを作成するためのステートメントで指定される driver_url パラメータによって指定されます。

JDBCリソースの作成と管理

JDBCリソースの作成

データベースからデータをクエリするための外部テーブルを作成する前に、StarRocksでJDBCリソースを作成してデータベースの接続情報を管理する必要があります。データベースはJDBCドライバをサポートしている必要があり、「ターゲットデータベース」と呼ばれます。リソースを作成した後、それを使用して外部テーブルを作成できます。

以下のステートメントを実行して、jdbc0 という名前のJDBCリソースを作成します。

CREATE EXTERNAL RESOURCE jdbc0
PROPERTIES (
"type"="jdbc",
"user"="postgres",
"password"="changeme",
"jdbc_uri"="jdbc:postgresql://127.0.0.1:5432/jdbc_test",
"driver_url"="https://repo1.maven.org/maven2/org/postgresql/postgresql/42.3.3/postgresql-42.3.3.jar",
"driver_class"="org.postgresql.Driver"
);

PROPERTIESで必要なパラメータは以下の通りです:

  • type: リソースのタイプ。値を jdbc に設定します。

  • user: ターゲットデータベースに接続するために使用されるユーザー名。

  • password: ターゲットデータベースに接続するために使用されるパスワード。

  • jdbc_uri: JDBCドライバがターゲットデータベースに接続するために使用するURI。URIの形式はデータベースURIの構文を満たす必要があります。一般的なデータベースのURI構文については、OraclePostgreSQLSQL Serverの公式ウェブサイトを参照してください。

注: URIにはターゲットデータベースの名前を含める必要があります。例えば、前述のコード例では、jdbc_test が接続したいターゲットデータベースの名前です。

  • driver_url: JDBCドライバJARパッケージのダウンロードURL。HTTP URLまたはファイルURLがサポートされています。例えば、https://repo1.maven.org/maven2/org/postgresql/postgresql/42.3.3/postgresql-42.3.3.jar または file:///home/disk1/postgresql-42.3.3.jar

  • driver_class: JDBCドライバのクラス名。一般的なデータベースのJDBCドライバクラス名は以下の通りです:

    • MySQL: com.mysql.jdbc.Driver (MySQL 5.x以前)、com.mysql.cj.jdbc.Driver (MySQL 6.x以降)
    • SQL Server: com.microsoft.sqlserver.jdbc.SQLServerDriver
    • Oracle: oracle.jdbc.driver.OracleDriver
    • PostgreSQL: org.postgresql.Driver

リソースが作成されると、FEはdriver_urlパラメータで指定されたURLを使用してJDBCドライバJARパッケージをダウンロードし、チェックサムを生成し、BEsがダウンロードしたJDBCドライバを検証するためにチェックサムを使用します。

注: JDBCドライバJARパッケージのダウンロードに失敗した場合、リソースの作成も失敗します。

BEsがJDBC外部テーブルを初めてクエリし、対応するJDBCドライバJARパッケージがマシン上に存在しない場合、BEsはdriver_urlパラメータで指定されたURLを使用してJDBCドライバJARパッケージをダウンロードし、すべてのJDBCドライバJARパッケージは${STARROCKS_HOME}/lib/jdbc_driversディレクトリに保存されます。

JDBCリソースの表示

以下のステートメントを実行して、StarRocks内のすべてのJDBCリソースを表示します。

SHOW RESOURCES;

注: ResourceType列はjdbcです。

JDBCリソースの削除

以下のステートメントを実行して、jdbc0という名前のJDBCリソースを削除します。

DROP RESOURCE "jdbc0";

注: JDBCリソースが削除されると、そのJDBCリソースを使用して作成されたすべてのJDBC外部テーブルが使用できなくなります。ただし、ターゲットデータベース内のデータは失われません。ターゲットデータベース内のデータをStarRocksでクエリする必要がある場合は、JDBCリソースとJDBC外部テーブルを再作成することができます。

データベースの作成

以下のステートメントを実行して、StarRocks内にjdbc_testという名前のデータベースを作成し、アクセスします。

CREATE DATABASE jdbc_test; 
USE jdbc_test;

注: 前述のステートメントで指定するデータベース名は、ターゲットデータベースの名前と同じである必要はありません。

JDBC外部テーブルの作成

以下のステートメントを実行して、jdbc_testデータベース内にjdbc_tblという名前のJDBC外部テーブルを作成します。

create external table jdbc_tbl (
`id` bigint NULL,
`data` varchar(200) NULL
) ENGINE=jdbc
properties (
"resource" = "jdbc0",
"table" = "dest_tbl"
);

propertiesで必要なパラメータは以下の通りです:

  • resource: 外部テーブルの作成に使用されるJDBCリソースの名前。

  • table: データベース内のターゲットテーブル名。

StarRocksとターゲットデータベース間のサポートされるデータ型とデータ型のマッピングについては、[Data type mapping](External_table.md#Data type mapping)を参照してください。

注:

  • インデックスはサポートされていません。
  • PARTITION BYまたはDISTRIBUTED BYを使用してデータ分布ルールを指定することはできません。

JDBC外部テーブルのクエリ

JDBC外部テーブルをクエリする前に、以下のステートメントを実行してPipelineエンジンを有効にする必要があります。

set enable_pipeline_engine=true;

注: Pipelineエンジンがすでに有効になっている場合、このステップをスキップできます。

以下のステートメントを実行して、JDBC外部テーブルを使用してターゲットデータベース内のデータをクエリします。

select * from JDBC_tbl;

StarRocksは、フィルター条件をターゲットテーブルにプッシュダウンすることで、述語プッシュダウンをサポートしています。データソースにできるだけ近い場所でフィルター条件を実行することで、クエリパフォーマンスを向上させることができます。現在、StarRocksは、バイナリ比較演算子(>, >=, =, <, <=)、INIS NULLBETWEEN ... AND ...を含む演算子をプッシュダウンできます。ただし、StarRocksは関数をプッシュダウンすることはできません。

データ型のマッピング

現在、StarRocksはターゲットデータベースの基本型のデータのみをクエリできます。例えば、NUMBER、STRING、TIME、DATEなどです。ターゲットデータベースのデータ値の範囲がStarRocksでサポートされていない場合、クエリはエラーを報告します。

ターゲットデータベースとStarRocksの間のマッピングは、ターゲットデータベースのタイプに基づいて異なります。

MySQLとStarRocks

MySQLStarRocks
BOOLEANBOOLEAN
TINYINTTINYINT
SMALLINTSMALLINT
MEDIUMINTINTINT
BIGINTBIGINT
FLOATFLOAT
DOUBLEDOUBLE
DECIMALDECIMAL
CHARCHAR
VARCHARVARCHAR
DATEDATE
DATETIMEDATETIME

OracleとStarRocks

OracleStarRocks
CHARCHAR
VARCHARVARCHAR2VARCHAR
DATEDATE
SMALLINTSMALLINT
INTINT
BINARY_FLOATFLOAT
BINARY_DOUBLEDOUBLE
DATEDATE
DATETIMEDATETIME
NUMBERDECIMAL

PostgreSQLとStarRocks

PostgreSQLStarRocks
SMALLINTSMALLSERIALSMALLINT
INTEGERSERIALINT
BIGINTBIGSERIALBIGINT
BOOLEANBOOLEAN
REALFLOAT
DOUBLE PRECISIONDOUBLE
DECIMALDECIMAL
TIMESTAMPDATETIME
DATEDATE
CHARCHAR
VARCHARVARCHAR
TEXTVARCHAR

SQL ServerとStarRocks

SQL ServerStarRocks
BOOLEANBOOLEAN
TINYINTTINYINT
SMALLINTSMALLINT
INTINT
BIGINTBIGINT
FLOATFLOAT
REALDOUBLE
DECIMALNUMERICDECIMAL
CHARCHAR
VARCHARVARCHAR
DATEDATE
DATETIMEDATETIME2DATETIME

制限事項

  • JDBC外部テーブルを作成する際、テーブルにインデックスを作成したり、PARTITION BYやDISTRIBUTED BYを使用してテーブルのデータ分布ルールを指定することはできません。

  • JDBC外部テーブルをクエリする際、StarRocksは関数をテーブルにプッシュダウンすることができません。

(非推奨) Elasticsearch外部テーブル

StarRocksとElasticsearchは、2つの人気のある分析システムです。StarRocksは大規模な分散コンピューティングにおいて高いパフォーマンスを発揮し、Elasticsearchは全文検索に最適です。StarRocksとElasticsearchを組み合わせることで、より完全なOLAPソリューションを提供できます。

Elasticsearch外部テーブルの作成例

構文

CREATE EXTERNAL TABLE elastic_search_external_table
(
k1 DATE,
k2 INT,
k3 SMALLINT,
k4 VARCHAR(2048),
k5 DATETIME
)
ENGINE=ELASTICSEARCH
PROPERTIES (
"hosts" = "http://192.168.0.1:9200,http://192.168.0.2:9200",
"user" = "root",
"password" = "root",
"index" = "tindex",
"type" = "_doc",
"es.net.ssl" = "true"
);

以下の表は、パラメータを説明しています。

パラメータ必須デフォルト値説明
hostsはいなしElasticsearchクラスターの接続アドレス。1つ以上のアドレスを指定できます。StarRocksはこのアドレスからElasticsearchのバージョンとインデックスシャードの割り当てを解析します。StarRocksは、GET /_nodes/http API操作によって返されるアドレスに基づいてElasticsearchクラスターと通信します。したがって、hostパラメータの値は、GET /_nodes/http API操作によって返されるアドレスと同じでなければなりません。そうでない場合、BEsはElasticsearchクラスターと通信できない可能性があります。
indexはいなしStarRocksに作成されたテーブル上のElasticsearchインデックスの名前。名前はエイリアスであることができます。このパラメータはワイルドカード(*)をサポートします。例えば、indexhello*に設定すると、StarRocksは名前がhelloで始まるすべてのインデックスを取得します。
userいいえ基本認証が有効なElasticsearchクラスターにログインするために使用されるユーザー名。/*cluster/state/*nodes/httpおよびインデックスへのアクセス権があることを確認してください。
passwordいいえElasticsearchクラスターにログインするために使用されるパスワード。
typeいいえ_docインデックスのタイプ。デフォルト値: _doc。Elasticsearch 8以降のバージョンでデータをクエリする場合、このパラメータを設定する必要はありません。Elasticsearch 8以降のバージョンではマッピングタイプが削除されています。
es.nodes.wan.onlyいいえfalseStarRocksがElasticsearchクラスターにアクセスしてデータを取得するためにhostsで指定されたアドレスのみを使用するかどうかを指定します。
  • true: StarRocksは、Elasticsearchクラスターにアクセスしてデータを取得するためにhostsで指定されたアドレスのみを使用し、Elasticsearchインデックスのシャードが存在するデータノードをスニッフしません。StarRocksがElasticsearchクラスター内のデータノードのアドレスにアクセスできない場合、このパラメータをtrueに設定する必要があります。
  • false: StarRocksは、Elasticsearchクラスターインデックスのシャードが存在するデータノードをスニッフするためにhostで指定されたアドレスを使用します。StarRocksがElasticsearchクラスター内のデータノードのアドレスにアクセスできる場合、デフォルト値falseを保持することをお勧めします。
es.net.sslいいえfalseElasticsearchクラスターにアクセスするためにHTTPSプロトコルを使用できるかどうかを指定します。StarRocks 2.4以降のバージョンのみがこのパラメータの設定をサポートしています。
  • true: ElasticsearchクラスターにアクセスするためにHTTPSおよびHTTPプロトコルの両方を使用できます。
  • false: ElasticsearchクラスターにアクセスするためにHTTPプロトコルのみを使用できます。
enable_docvalue_scanいいえtrueElasticsearchの列指向ストレージからターゲットフィールドの値を取得するかどうかを指定します。ほとんどの場合、列指向ストレージからデータを読み取る方が行指向ストレージからデータを読み取るよりも優れています。
enable_keyword_sniffいいえtrueElasticsearchでTEXT型フィールドをKEYWORD型フィールドに基づいてスニッフするかどうかを指定します。このパラメータをfalseに設定すると、StarRocksはトークン化後にマッチングを実行します。
より高速なクエリのための列指向スキャン

enable_docvalue_scantrueに設定すると、StarRocksはElasticsearchからデータを取得する際に以下のルールに従います:

  • 試してみる: StarRocksはターゲットフィールドに対して列指向ストレージが有効かどうかを自動的に確認します。有効である場合、StarRocksはターゲットフィールドのすべての値を列指向ストレージから取得します。
  • 自動ダウングレード: ターゲットフィールドのいずれかが列指向ストレージで利用できない場合、StarRocksは行指向ストレージ(_source)からターゲットフィールドのすべての値を解析して取得します。

注意

  • ElasticsearchのTEXT型フィールドには列指向ストレージが利用できません。したがって、TEXT型の値を含むフィールドをクエリする場合、StarRocksはフィールドの値を_sourceから取得します。
  • 多数のフィールド(25以上)をクエリする場合、docvalueからフィールド値を読み取ることは、_sourceからフィールド値を読み取ることと比較して顕著な利点を示しません。
KEYWORD型フィールドのスニッフ

enable_keyword_snifftrueに設定すると、Elasticsearchはインデックスなしで直接データ取り込みを許可します。取り込み後に自動的にインデックスを作成します。STRING型フィールドの場合、ElasticsearchはTEXT型とKEYWORD型の両方を持つフィールドを作成します。これはElasticsearchのマルチフィールド機能の動作です。マッピングは以下の通りです:

"k4": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}

例えば、k4に対して"="フィルタリングを行う場合、StarRocks on Elasticsearchはフィルタリング操作をElasticsearchのTermQueryに変換します。

元のSQLフィルターは以下の通りです:

k4 = "StarRocks On Elasticsearch"

変換されたElasticsearchクエリDSLは以下の通りです:

"term" : {
"k4": "StarRocks On Elasticsearch"
}

k4の最初のフィールドはTEXTであり、データ取り込み後にk4に設定されたアナライザー(またはアナライザーが設定されていない場合は標準アナライザー)によってトークン化されます。その結果、最初のフィールドは3つの用語にトークン化されます: StarRocks, On, Elasticsearch。詳細は以下の通りです:

POST /_analyze
{
"analyzer": "standard",
"text": "StarRocks On Elasticsearch"
}

トークン化の結果は以下の通りです:

{
"tokens": [
{
"token": "starrocks",
"start_offset": 0,
"end_offset": 5,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "on",
"start_offset": 6,
"end_offset": 8,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "elasticsearch",
"start_offset": 9,
"end_offset": 11,
"type": "<ALPHANUM>",
"position": 2
}
]
}

次のようなクエリを実行するとします:

"term" : {
"k4": "StarRocks On Elasticsearch"
}

辞書にStarRocks On Elasticsearchに一致する用語がないため、結果は返されません。

しかし、enable_keyword_snifftrueに設定している場合、StarRocksはk4 = "StarRocks On Elasticsearch"k4.keyword = "StarRocks On Elasticsearch"に変換してSQLセマンティクスに一致させます。変換されたStarRocks On ElasticsearchクエリDSLは以下の通りです:

"term" : {
"k4.keyword": "StarRocks On Elasticsearch"
}

k4.keywordはKEYWORD型です。したがって、データはElasticsearchに完全な用語として書き込まれ、正常に一致します。

カラムデータ型のマッピング

外部テーブルを作成する際、Elasticsearchテーブルのカラムデータ型に基づいて外部テーブルのカラムデータ型を指定する必要があります。以下の表はカラムデータ型のマッピングを示しています。

ElasticsearchStarRocks
BOOLEANBOOLEAN
BYTETINYINT/SMALLINT/INT/BIGINT
SHORTSMALLINT/INT/BIGINT
INTEGERINT/BIGINT
LONGBIGINT
FLOATFLOAT
DOUBLEDOUBLE
KEYWORDCHAR/VARCHAR
TEXTCHAR/VARCHAR
DATEDATE/DATETIME
NESTEDCHAR/VARCHAR
OBJECTCHAR/VARCHAR
ARRAYARRAY

注意

  • StarRocksは、NESTED型のデータをJSON関連の関数を使用して読み取ります。
  • Elasticsearchは多次元配列を自動的に一次元配列にフラット化します。StarRocksも同様です。ElasticsearchからのARRAYデータのクエリサポートはv2.5から追加されました。

述語プッシュダウン

StarRocksは述語プッシュダウンをサポートしています。フィルターはElasticsearchにプッシュダウンされて実行され、クエリパフォーマンスを向上させます。以下の表は述語プッシュダウンをサポートする演算子を示しています。

SQL構文ES構文
=term query
interms query
>=, <=, >, <range
andbool.filter
orbool.should
notbool.must_not
not inbool.must_not + terms
esqueryES Query DSL

esquery関数は、SQLで表現できないクエリ(例えば、matchやgeoshape)をElasticsearchにプッシュダウンしてフィルタリングするために使用されます。esquery関数の最初のパラメータはインデックスを関連付けるために使用されます。2番目のパラメータは、で囲まれた基本的なQuery DSLのJSON式です。JSON式には1つのルートキーが必要ですが、1つだけです。例えば、match、geo_shape、またはboolです。

  • matchクエリ
select * from es_table where esquery(k4, '{
"match": {
"k4": "StarRocks on elasticsearch"
}
}');
  • geo関連クエリ
select * from es_table where esquery(k4, '{
"geo_shape": {
"location": {
"shape": {
"type": "envelope",
"coordinates": [
[
13,
53
],
[
14,
52
]
]
},
"relation": "within"
}
}
}');
  • boolクエリ
select * from es_table where esquery(k4, ' {
"bool": {
"must": [
{
"terms": {
"k1": [
11,
12
]
}
},
{
"terms": {
"k2": [
100
]
}
}
]
}
}');

使用上の注意

  • Elasticsearch 5.x以前のバージョンは、5.x以降のバージョンとは異なる方法でデータをスキャンします。現在、5.x以降のバージョンのみがサポートされています
  • HTTP基本認証が有効なElasticsearchクラスターがサポートされています。
  • StarRocksからデータをクエリすることは、Elasticsearchから直接データをクエリすることほど速くないかもしれません。例えば、カウント関連のクエリです。その理由は、Elasticsearchがターゲットドキュメントのメタデータを直接読み取り、実際のデータをフィルタリングする必要がないため、カウントクエリが高速化されるからです。

(非推奨) Hive外部テーブル

Hive外部テーブルを使用する前に、サーバーにJDK 1.8がインストールされていることを確認してください。

Hiveリソースの作成

HiveリソースはHiveクラスターに対応します。StarRocksが使用するHiveクラスターを設定する必要があります。例えば、Hiveメタストアのアドレスを設定します。Hive外部テーブルで使用するHiveリソースを指定する必要があります。

  • hive0という名前のHiveリソースを作成します。
CREATE EXTERNAL RESOURCE "hive0"
PROPERTIES (
"type" = "hive",
"hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083"
);
  • StarRocksで作成されたリソースを表示します。
SHOW RESOURCES;
  • hive0という名前のリソースを削除します。
DROP RESOURCE "hive0";

StarRocks 2.3以降のバージョンでは、Hiveリソースのhive.metastore.urisを変更することができます。詳細は ALTER RESOURCE を参照してください。

データベースの作成

CREATE DATABASE hive_test;
USE hive_test;

Hive外部テーブルの作成

構文

CREATE EXTERNAL TABLE table_name (
col_name col_type [NULL | NOT NULL] [COMMENT "comment"]
) ENGINE=HIVE
PROPERTIES (
"key" = "value"
);

例: hive0リソースに対応するHiveクラスターのrawdataデータベースにprofile_parquet_p7という外部テーブルを作成します。

CREATE EXTERNAL TABLE `profile_wos_p7` (
`id` bigint NULL,
`first_id` varchar(200) NULL,
`second_id` varchar(200) NULL,
`p__device_id_list` varchar(200) NULL,
`p__is_deleted` bigint NULL,
`p_channel` varchar(200) NULL,
`p_platform` varchar(200) NULL,
`p_source` varchar(200) NULL,
`p__city` varchar(200) NULL,
`p__province` varchar(200) NULL,
`p__update_time` bigint NULL,
`p__first_visit_time` bigint NULL,
`p__last_seen_time` bigint NULL
) ENGINE=HIVE
PROPERTIES (
"resource" = "hive0",
"database" = "rawdata",
"table" = "profile_parquet_p7"
);

説明:

  • 外部テーブルのカラム

    • カラム名はHiveテーブルのカラム名と同じでなければなりません。
    • カラムの順序はHiveテーブルのカラム順序と同じである必要はありません。
    • Hiveテーブルのカラムの一部のみを選択することができますが、すべてのパーティションキーのカラムを選択する必要があります。
    • 外部テーブルのパーティションキーのカラムは、partition byを使用して指定する必要はありません。他のカラムと同じ説明リストで定義する必要があります。パーティション情報を指定する必要はありません。StarRocksはHiveテーブルからこの情報を自動的に同期します。
    • ENGINEをHIVEに設定します。
  • PROPERTIES:

    • hive.resource: 使用するHiveリソース。
    • database: Hiveデータベース。
    • table: Hiveのテーブル。ビューはサポートされていません。
  • 以下の表は、HiveとStarRocks間のカラムデータ型のマッピングを示しています。

    HiveのカラムタイプStarRocksのカラムタイプ説明
    INT/INTEGERINT
    BIGINTBIGINT
    TIMESTAMPDATETIMETIMESTAMPデータをDATETIMEデータに変換する際、精度とタイムゾーン情報が失われます。セッション変数のタイムゾーンに基づいて、タイムゾーンオフセットのないDATETIMEデータに変換する必要があります。
    STRINGVARCHAR
    VARCHARVARCHAR
    CHARCHAR
    DOUBLEDOUBLE
    FLOATFLOAT
    DECIMALDECIMAL
    ARRAYARRAY

注:

  • 現在サポートされているHiveストレージフォーマットはParquet、ORC、CSVです。 CSVの場合、引用符をエスケープ文字として使用することはできません。
  • SNAPPYおよびLZ4圧縮フォーマットがサポートされています。
  • クエリできるHiveの文字列カラムの最大長は1MBです。文字列カラムが1MBを超える場合、nullカラムとして処理されます。

Hive外部テーブルの使用

profile_wos_p7の総行数をクエリします。

select count(*) from profile_wos_p7;

キャッシュされたHiveテーブルメタデータの更新

  • Hiveのパーティション情報と関連するファイル情報はStarRocksにキャッシュされます。キャッシュはhive_meta_cache_refresh_interval_sで指定された間隔で更新されます。デフォルト値は7200です。hive_meta_cache_ttl_sはキャッシュのタイムアウト期間を指定し、デフォルト値は86400です。
    • キャッシュされたデータは手動で更新することもできます。
      1. Hiveでテーブルからパーティションが追加または削除された場合、REFRESH EXTERNAL TABLE hive_tコマンドを実行して、StarRocksにキャッシュされたテーブルメタデータを更新する必要があります。hive_tはStarRocks内のHive外部テーブルの名前です。
      2. Hiveの一部のパーティションのデータが更新された場合、REFRESH EXTERNAL TABLE hive_t PARTITION ('k1=01/k2=02', 'k1=03/k2=04')コマンドを実行して、StarRocksにキャッシュされたデータを更新する必要があります。hive_tはStarRocks内のHive外部テーブルの名前です。'k1=01/k2=02''k1=03/k2=04'はデータが更新されたHiveパーティションの名前です。
      3. REFRESH EXTERNAL TABLE hive_tを実行すると、StarRocksはまずHive外部テーブルのカラム情報がHiveメタストアから返されるHiveテーブルのカラム情報と同じであるかどうかを確認します。Hiveテーブルのスキーマが変更された場合(カラムの追加や削除など)、StarRocksは変更をHive外部テーブルに同期します。同期後、Hive外部テーブルのカラム順序はHiveテーブルのカラム順序と同じままで、パーティションカラムが最後のカラムになります。
  • HiveデータがParquet、ORC、CSV形式で保存されている場合、StarRocks 2.3以降のバージョンでは、Hiveテーブルのスキーマ変更(ADD COLUMNやREPLACE COLUMNなど)をHive外部テーブルに同期することができます。

オブジェクトストレージへのアクセス

  • FE設定ファイルのパスはfe/confであり、Hadoopクラスターをカスタマイズする必要がある場合は設定ファイルを追加できます。例えば、HDFSクラスターが高可用性の名前サービスを使用している場合、hdfs-site.xmlfe/confに配置する必要があります。HDFSがViewFsで構成されている場合、core-site.xmlfe/confに配置する必要があります。

  • BE設定ファイルのパスはbe/confであり、Hadoopクラスターをカスタマイズする必要がある場合は設定ファイルを追加できます。例えば、高可用性の名前サービスを使用するHDFSクラスターの場合、hdfs-site.xmlbe/confに配置する必要があります。HDFSがViewFsで構成されている場合、core-site.xmlbe/confに配置する必要があります。

  • BEが配置されているマシンで、BEの起動スクリプトbin/start_be.shでJAVA_HOMEをJRE環境ではなくJDK環境として構成します。例えば、export JAVA_HOME = <JDKパス>です。この設定をスクリプトの先頭に追加し、BEを再起動して設定を有効にする必要があります。

  • Kerberosサポートの構成:

    1. HiveとHDFSにアクセスするために、すべてのFE/BEマシンでkinit -kt keytab_path principalでログインする必要があります。kinitコマンドのログインは一定期間のみ有効であり、定期的に実行するためにcrontabに追加する必要があります。
    2. hive-site.xml/core-site.xml/hdfs-site.xmlfe/confに配置し、core-site.xml/hdfs-site.xmlbe/confに配置します。
    3. $FE_HOME/conf/fe.confファイルのJAVA_OPTSオプションの値に-Djava.security.krb5.conf=/etc/krb5.confを追加します。/etc/krb5.confkrb5.confファイルの保存パスです。オペレーティングシステムに基づいてパスを変更できます。
    4. $BE_HOME/conf/be.confファイルに直接JAVA_OPTS="-Djava.security.krb5.conf=/etc/krb5.conf"を追加します。/etc/krb5.confkrb5.confファイルの保存パスです。オペレーティングシステムに基づいてパスを変更できます。
    5. Hiveリソースを追加する際、hive.metastore.urisにドメイン名を渡す必要があります。さらに、Hive/HDFSのドメイン名とIPアドレスのマッピングを**/etc/hosts**ファイルに追加する必要があります。
  • AWS S3のサポートを構成する: fe/conf/core-site.xmlbe/conf/core-site.xmlに以下の設定を追加します。

    <configuration>
    <property>
    <name>fs.s3a.access.key</name>
    <value>******</value>
    </property>
    <property>
    <name>fs.s3a.secret.key</name>
    <value>******</value>
    </property>
    <property>
    <name>fs.s3a.endpoint</name>
    <value>s3.us-west-2.amazonaws.com</value>
    </property>
    <property>
    <name>fs.s3a.connection.maximum</name>
    <value>500</value>
    </property>
    </configuration>
    1. fs.s3a.access.key: AWSアクセスキーID。
    2. fs.s3a.secret.key: AWSシークレットキー。
    3. fs.s3a.endpoint: 接続するAWS S3エンドポイント。
    4. fs.s3a.connection.maximum: StarRocksからS3への同時接続の最大数。クエリ中にTimeout waiting for connection from pollエラーが発生した場合、このパラメータをより大きな値に設定できます。

(非推奨) Iceberg外部テーブル

v2.1.0以降、StarRocksは外部テーブルを使用してApache Icebergからデータをクエリすることを可能にしています。Icebergのデータをクエリするには、StarRocksでIceberg外部テーブルを作成する必要があります。テーブルを作成する際、クエリしたいIcebergテーブルとの間にマッピングを確立する必要があります。

始める前に

StarRocksがApache Icebergで使用されるメタデータサービス(例えば、Hiveメタストア)、ファイルシステム(例えば、HDFS)、およびオブジェクトストレージシステム(例えば、Amazon S3やAlibaba Cloud Object Storage Service)にアクセスする権限を持っていることを確認してください。

注意事項

  • Iceberg外部テーブルは、以下のタイプのデータのみをクエリするために使用できます:

    • Iceberg v1テーブル(分析データテーブル)。ORC形式のIceberg v2(行レベル削除)テーブルはv3.0以降でサポートされ、Parquet形式のIceberg v2テーブルはv3.1以降でサポートされています。Iceberg v1テーブルとIceberg v2テーブルの違いについては、Iceberg Table Specを参照してください。
    • gzip(デフォルト形式)、Zstd、LZ4、またはSnappy形式で圧縮されたテーブル。
    • ParquetまたはORC形式で保存されたファイル。
  • StarRocks 2.3以降のバージョンのIceberg外部テーブルは、Icebergテーブルのスキーマ変更を同期することをサポートしていますが、StarRocks 2.3以前のバージョンのIceberg外部テーブルはサポートしていません。Icebergテーブルのスキーマが変更された場合、対応する外部テーブルを削除し、新しいものを作成する必要があります。

手順

ステップ1: Icebergリソースの作成

Iceberg外部テーブルを作成する前に、StarRocksでIcebergリソースを作成する必要があります。このリソースはIcebergアクセス情報を管理するために使用されます。さらに、このリソースを外部テーブルを作成するためのステートメントで指定する必要があります。ビジネス要件に基づいてリソースを作成できます:

  • IcebergテーブルのメタデータがHiveメタストアから取得される場合、リソースを作成し、catalogタイプをHIVEに設定できます。

  • Icebergテーブルのメタデータが他のサービスから取得される場合、カスタムcatalogを作成する必要があります。その後、リソースを作成し、catalogタイプをCUSTOMに設定します。

catalogタイプがHIVEのリソースを作成する

例えば、iceberg0という名前のリソースを作成し、catalogタイプをHIVEに設定します。

CREATE EXTERNAL RESOURCE "iceberg0" 
PROPERTIES (
"type" = "iceberg",
"iceberg.catalog.type" = "HIVE",
"iceberg.catalog.hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083"
);

以下の表は関連するパラメータを説明しています。

パラメータ説明
typeリソースタイプ。値をicebergに設定します。
iceberg.catalog.typeリソースのcatalogタイプ。Hive catalogとカスタムcatalogの両方がサポートされています。Hive catalogを指定する場合、値をHIVEに設定します。カスタムcatalogを指定する場合、値をCUSTOMに設定します。
iceberg.catalog.hive.metastore.urisHiveメタストアのURI。パラメータ値は次の形式です: thrift://< IcebergメタデータのIPアドレス >:< ポート番号 >。ポート番号はデフォルトで9083です。Apache IcebergはHive catalogを使用してHiveメタストアにアクセスし、Icebergテーブルのメタデータをクエリします。
catalogタイプがCUSTOMのリソースを作成する

カスタムcatalogは抽象クラスBaseMetastoreCatalogを継承し、IcebergCatalogインターフェースを実装する必要があります。さらに、カスタムcatalogのクラス名はStarRockに既に存在するクラスの名前と重複してはなりません。catalogが作成された後、catalogとその関連ファイルをパッケージ化し、各フロントエンド(FE)のfe/libパスに配置します。その後、各FEを再起動します。前述の操作を完了した後、catalogがカスタムcatalogであるリソースを作成できます。

例えば、iceberg1という名前のリソースを作成し、catalogタイプをCUSTOMに設定します。

CREATE EXTERNAL RESOURCE "iceberg1" 
PROPERTIES (
"type" = "iceberg",
"iceberg.catalog.type" = "CUSTOM",
"iceberg.catalog-impl" = "com.starrocks.IcebergCustomCatalog"
);

以下の表は関連するパラメータを説明しています。

パラメータ説明
typeリソースタイプ。値をicebergに設定します。
iceberg.catalog.typeリソースのcatalogタイプ。Hive catalogとカスタムcatalogの両方がサポートされています。Hive catalogを指定する場合、値をHIVEに設定します。カスタムcatalogを指定する場合、値をCUSTOMに設定します。
iceberg.catalog-implカスタムcatalogの完全修飾クラス名。FEsはこの名前に基づいてcatalogを検索します。catalogにカスタム設定項目が含まれている場合、外部テーブルを作成する際にPROPERTIESパラメータにキーと値のペアとして追加する必要があります。

StarRocks 2.3以降のバージョンでは、Icebergリソースのhive.metastore.urisiceberg.catalog-implを変更することができます。詳細は ALTER RESOURCE を参照してください。

Icebergリソースの表示
SHOW RESOURCES;
Icebergリソースの削除

例えば、iceberg0という名前のリソースを削除します。

DROP RESOURCE "iceberg0";

Icebergリソースを削除すると、そのリソースを参照するすべての外部テーブルが使用できなくなります。ただし、Apache Iceberg内の対応するデータは削除されません。Apache Iceberg内のデータを引き続きクエリする必要がある場合は、新しいリソースと新しい外部テーブルを作成してください。

ステップ2: (オプション) データベースの作成

例えば、StarRocksにiceberg_testという名前のデータベースを作成します。

CREATE DATABASE iceberg_test; 
USE iceberg_test;

注: StarRocks内のデータベース名は、Apache Iceberg内のデータベース名と異なる場合があります。

ステップ3: Iceberg外部テーブルの作成

例えば、iceberg_testデータベース内にiceberg_tblという名前のIceberg外部テーブルを作成します。

CREATE EXTERNAL TABLE `iceberg_tbl` ( 
`id` bigint NULL,
`data` varchar(200) NULL
) ENGINE=ICEBERG
PROPERTIES (
"resource" = "iceberg0",
"database" = "iceberg",
"table" = "iceberg_table"
);

以下の表は関連するパラメータを説明しています。

パラメータ説明
ENGINEエンジン名。値をICEBERGに設定します。
resource外部テーブルが参照するIcebergリソースの名前。
databaseIcebergテーブルが属するデータベースの名前。
tableIcebergテーブルの名前。

注:

  • 外部テーブルの名前は、Icebergテーブルの名前と異なる場合があります。

  • 外部テーブルのカラム名は、Icebergテーブルのカラム名と同じでなければなりません。2つのテーブルのカラム順序は異なる場合があります。

カスタムcatalogで設定項目を定義し、データをクエリする際に設定項目を有効にしたい場合、外部テーブルを作成する際にPROPERTIESパラメータにキーと値のペアとして設定項目を追加できます。例えば、カスタムcatalogでcustom-catalog.propertiesという設定項目を定義した場合、以下のコマンドを実行して外部テーブルを作成できます。

CREATE EXTERNAL TABLE `iceberg_tbl` ( 
`id` bigint NULL,
`data` varchar(200) NULL
) ENGINE=ICEBERG
PROPERTIES (
"resource" = "iceberg0",
"database" = "iceberg",
"table" = "iceberg_table",
"custom-catalog.properties" = "my_property"
);

外部テーブルを作成する際、Icebergテーブルのカラムデータ型に基づいて外部テーブルのカラムデータ型を指定する必要があります。以下の表はカラムデータ型のマッピングを示しています。

IcebergテーブルIceberg外部テーブル
BOOLEANBOOLEAN
INTTINYINT / SMALLINT / INT
LONGBIGINT
FLOATFLOAT
DOUBLEDOUBLE
DECIMAL(P, S)DECIMAL
DATEDATE / DATETIME
TIMEBIGINT
TIMESTAMPDATETIME
STRINGSTRING / VARCHAR
UUIDSTRING / VARCHAR
FIXED(L)CHAR
BINARYVARCHAR
LISTARRAY

StarRocksは、TIMESTAMPTZ、STRUCT、およびMAP型のIcebergデータのクエリをサポートしていません。

ステップ4: Apache Iceberg内のデータをクエリする

外部テーブルが作成された後、外部テーブルを使用してApache Iceberg内のデータをクエリできます。

select count(*) from iceberg_tbl;

(非推奨) Hudi外部テーブル

v2.2.0以降、StarRocksはHudi外部テーブルを使用してHudiデータレイクからデータをクエリすることを可能にしています。これにより、非常に高速なデータレイク分析が可能になります。このトピックでは、StarRocksクラスターでHudi外部テーブルを作成し、Hudiデータレイクからデータをクエリする方法について説明します。

始める前に

StarRocksクラスターがHiveメタストア、HDFSクラスター、またはHudiテーブルを登録できるバケットにアクセスできる権限を持っていることを確認してください。

注意事項

  • Hudi外部テーブルは読み取り専用であり、クエリにのみ使用できます。
  • StarRocksは、Copy on WriteテーブルとMerge On Readテーブル(MORテーブルはv2.5からサポートされています)をクエリすることをサポートしています。これら2つのテーブルタイプの違いについては、Table & Query Typesを参照してください。
  • StarRocksは、Hudiの次の2つのクエリタイプをサポートしています: スナップショットクエリと読み取り最適化クエリ(HudiはMerge On Readテーブルでのみ読み取り最適化クエリをサポートしています)。インクリメンタルクエリはサポートされていません。Hudiのクエリタイプの詳細については、Table & Query Typesを参照してください。
  • StarRocksは、Hudiファイルの次の圧縮形式をサポートしています: gzip、zstd、LZ4、およびSnappy。Hudiファイルのデフォルトの圧縮形式はgzipです。
  • StarRocksは、Hudi管理テーブルからのスキーマ変更を同期することができません。詳細については、Schema Evolutionを参照してください。Hudi管理テーブルのスキーマが変更された場合、StarRocksクラスターから関連するHudi外部テーブルを削除し、その外部テーブルを再作成する必要があります。

手順

ステップ1: Hudiリソースの作成と管理

StarRocksクラスターでHudiリソースを作成する必要があります。Hudiリソースは、StarRocksクラスターで作成するHudiデータベースと外部テーブルを管理するために使用されます。

Hudiリソースの作成

以下のステートメントを実行して、hudi0という名前のHudiリソースを作成します。

CREATE EXTERNAL RESOURCE "hudi0" 
PROPERTIES (
"type" = "hudi",
"hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083"
);

以下の表はパラメータを説明しています。

パラメータ説明
typeHudiリソースのタイプ。値をhudiに設定します。
hive.metastore.urisHudiリソースが接続するHiveメタストアのThrift URI。HudiリソースをHiveメタストアに接続した後、Hiveを使用してHudiテーブルを作成および管理できます。Thrift URIは<HiveメタストアのIPアドレス>:<Hiveメタストアのポート番号>形式です。デフォルトのポート番号は9083です。

v2.3以降、StarRocksはHudiリソースのhive.metastore.uris値を変更することを許可しています。詳細は ALTER RESOURCE を参照してください。

Hudiリソースの表示

以下のステートメントを実行して、StarRocksクラスターで作成されたすべてのHudiリソースを表示します。

SHOW RESOURCES;
Hudiリソースの削除

以下のステートメントを実行して、hudi0という名前のHudiリソースを削除します。

DROP RESOURCE "hudi0";

注:

Hudiリソースを削除すると、そのHudiリソースを使用して作成されたすべてのHudi外部テーブルが使用できなくなります。ただし、Hudiに保存されているデータには影響しません。StarRocksを使用してHudiからデータをクエリし続けたい場合は、StarRocksクラスターでHudiリソース、Hudiデータベース、およびHudi外部テーブルを再作成する必要があります。

ステップ2: Hudiデータベースの作成

以下のステートメントを実行して、StarRocksクラスターにhudi_testという名前のHudiデータベースを作成し、開きます。

CREATE DATABASE hudi_test; 
USE hudi_test;

注:

StarRocksクラスターで指定するHudiデータベースの名前は、関連するHudiデータベースと同じである必要はありません。

ステップ3: Hudi外部テーブルの作成

以下のステートメントを実行して、hudi_test Hudiデータベースにhudi_tblという名前のHudi外部テーブルを作成します。

CREATE EXTERNAL TABLE `hudi_tbl` ( 
`id` bigint NULL,
`data` varchar(200) NULL
) ENGINE=HUDI
PROPERTIES (
"resource" = "hudi0",
"database" = "hudi",
"table" = "hudi_table"
);

以下の表はパラメータを説明しています。

パラメータ説明
ENGINEHudi外部テーブルのクエリエンジン。値をHUDIに設定します。
resourceStarRocksクラスター内のHudiリソースの名前。
databaseStarRocksクラスター内のHudi外部テーブルが属するHudiデータベースの名前。
tableHudi外部テーブルが関連付けられているHudi管理テーブル。

注:

  • Hudi外部テーブルの名前は、関連付けられているHudi管理テーブルの名前と同じである必要はありません。

  • Hudi外部テーブルのカラムは、関連付けられているHudi管理テーブルのカラムと同じ名前を持つ必要がありますが、順序は異なる場合があります。

  • 関連付けられているHudi管理テーブルから一部またはすべてのカラムを選択し、Hudi外部テーブルに選択したカラムのみを作成できます。以下の表は、Hudiがサポートするデータ型とStarRocksがサポートするデータ型のマッピングを示しています。

Hudiがサポートするデータ型StarRocksがサポートするデータ型
BOOLEANBOOLEAN
INTTINYINT/SMALLINT/INT
DATEDATE
TimeMillis/TimeMicrosTIME
TimestampMillis/TimestampMicrosDATETIME
LONGBIGINT
FLOATFLOAT
DOUBLEDOUBLE
STRINGCHAR/VARCHAR
ARRAYARRAY
DECIMALDECIMAL

注意

StarRocksは、STRUCT型またはMAP型のデータのクエリをサポートしていません。また、Merge On ReadテーブルのARRAY型データのクエリもサポートしていません。

ステップ4: Hudi外部テーブルからデータをクエリする

特定のHudi管理テーブルに関連付けられたHudi外部テーブルを作成した後、Hudi外部テーブルにデータをロードする必要はありません。Hudiからデータをクエリするには、以下のステートメントを実行します。

SELECT COUNT(*) FROM hudi_tbl;

(非推奨) MySQL外部テーブル

スタースキーマでは、データは一般的にディメンションテーブルとファクトテーブルに分けられます。ディメンションテーブルはデータ量が少なく、UPDATE操作が含まれます。現在、StarRocksは直接のUPDATE操作をサポートしていません(更新はユニークキーテーブルを使用して実装できます)。いくつかのシナリオでは、ディメンションテーブルをMySQLに保存して直接データを読み取ることができます。

MySQLデータをクエリするには、StarRocksで外部テーブルを作成し、それをMySQLデータベース内のテーブルにマッピングする必要があります。テーブルを作成する際にMySQL接続情報を指定する必要があります。

CREATE EXTERNAL TABLE mysql_external_table
(
k1 DATE,
k2 INT,
k3 SMALLINT,
k4 VARCHAR(2048),
k5 DATETIME
)
ENGINE=mysql
PROPERTIES
(
"host" = "127.0.0.1",
"port" = "3306",
"user" = "mysql_user",
"password" = "mysql_passwd",
"database" = "mysql_db_test",
"table" = "mysql_table_test"
);

パラメータ:

  • host: MySQLデータベースの接続アドレス
  • port: MySQLデータベースのポート番号
  • user: MySQLにログインするためのユーザー名
  • password: MySQLにログインするためのパスワード
  • database: MySQLデータベースの名前
  • table: MySQLデータベース内のテーブルの名前