このドキュメントでは、Realtime Compute の DDL 文と、フィールドマッピング、大文字と小文字の区別など、DDL の使用中に注意が必要な問題について説明します。
構文
CREATE TABLE tableName
(columnName dataType [, columnName dataType ]*)
[ WITH (propertyName=propertyValue [, propertyName=propertyValue ]*) ];
説明
Realtime Compute は、ビルトインデータストレージ機能を提供していません。 したがって、テーブルの作成に関係するすべての DDL 文は、外部データテーブルまたはストレージシステムの参照宣言です。 サンプルコードは次のとおりです。
CREATE TABLE mq_stream(
a VARCHAR,
b VARCAHR,
c VARCAHR
) WITH (
type='mq',
topic='blink_mq_test',
accessId='yourAccessId',
accessKey='yourAccessKey'
);
上記のコードでは Flink SQL の MQ ソーステーブル の topic
を作成しません。 代わりに、mq_stream
という名前のテーブルへの参照を宣言します。 ダウンストリーム演算子のこの MQ トピックに関連するすべての DML 操作に関して、トピック名をエイリアス mq_stream
に置き換えることができます。
- テーブルの宣言は、Realtime Compute の現在のジョブでのみ有効です。 SQL ファイルが送信されると、Realtime Compute ジョブが生成されます。
mq_stream
テーブルの上記の宣言は、現在の SQL ファイルでのみ有効です。 同じ Realtime Compute プロジェクト内の他の SQL ファイルでもmq_stream
テーブルを宣言できます 。 - 標準 SQL 定義によれば、DDL 文のキーワード、テーブル名、およびフィールド名は大文字と小文字を区別しません。
- テーブル名とフィールド名は、英数字で始める必要があり、英数字、アンダースコア (_) のみ使用できます。
- 使用するアップストリームプラグインの性質に応じて、DDL 宣言は、フィールド名だけでなく他の要因に基づき、宣言テーブルと外部テーブル間のフィールドマッピングを確立する場合があります。
参照される外部テーブルと同じフィールド名、およびフィールド数を宣言することを推奨します。 これにより、分かりにくい宣言によるデータエラーを防ぐことができます。
注 アップストリームプラグインが、key-value ペアのキーに基づいた値の取得をサポートしている場合、宣言テーブルとその参照される外部テーブルは、同じ数のフィールドを持つ必要はありません。 ただし、フィールド名は同じである必要があります。 アップストリームプラグインがキーに基づく値の取得をサポートしていない場合、フィールドの数とその順序は、宣言テーブルと外部テーブルで同じでなければなりません。
フィールドマッピング
- 順次マッピング
このメソッドは、スキーマのないデータソース (MQ など) に適用されます。 これらのデータソースは通常、キーに基づく値の取得をサポートしない非構造化ストレージシステムです。 DDL SQL 文のフィールド名をカスタマイズし、外部テーブルと同じフィールドタイプと同じフィールド数を宣言テーブルで使用することを推奨します。
MQ のサンプルレコードは次のとおりです。
asavfa,sddd32,sdfdsv
命名規則に従って MQ フィールド名を指定します。
CREATE TABLE mq_stream( a VARCHAR, b VARCHAR, c VARCAHR ) WITH ( type='mq', topic='blink_mq_test', accessId='yourAccessId', accessKey='yourAccessSecret' );
- 名前マッピング
このメソッドは、スキーマを持つデータソースに適用されます。 これらのデータストレージシステムは、テーブルストレージレベルでフィールド名とフィールドタイプを定義し、キーに基づいた値の取得をサポートします。 Flink SQL 宣言では、外部データストレージシステムと同じスキーマ定義を使用することを推奨します。 具体的には、宣言テーブルのフィールドの名前、番号、および順序は、外部テーブルのフィールドと同じでなければなりません。注 外部データストレージシステムのフィールド名が大文字と小文字を区別する場合 (たとえば Table Store)、大文字と小文字を区別するフィールド名をバッククォート (
`
) で囲みます。 DDL 構文では、宣言テーブルのフィールド名は外部テーブルのフィールド名と同じでなければなりません。
大文字と小文字の区別
標準 SQL 定義では、フィールドは大文字と小文字を区別しません。 たとえば、次の 2 つのステートメントの意味は同じです。
create table stream_result (
name varchar,
value varchar
);
create table STREAM_RESULT (
NAME varchar,
VALUE varchar
);
ただし、Realtime Compute によって参照されるほとんどの外部データソースでは大文字と小文字が区別されます。 たとえば、Table Store では大文字と小文字が区別されます。
次のステートメントは、Table Store の大文字の NAME
フィールドを定義する方法を示しています。
create table STREAM_RESULT (
`NAME` varchar,
`VALUE` varchar
);
次のステートメントで示すように、参照されるたびに後続のすべての DML 文で、フィールドをバッククォート (`
) で囲みます。
INSERT INTO table_a
SELECT
`NAME`,
`VALUE`
FROM
table_b;