このトピックでは、Spark SQL でのデータ定義言語 (DDL) 構文について説明します。

構文

CREATE TABLE tbName[(columnName dataType [,columnName dataType]*)]
USING providerName
OPTIONS(propertyName=propertyValue[,propertyName=propertyValue]*);
-- CTAS

CREATE TABLE tbName[(columnName dataType [,columnName dataType]*)]
USING providerName
OPTIONS(propertyName=propertyValue[,propertyName=propertyValue]*)
AS
queryStatement;

CTAS 文は、テーブルを作成する文と、クエリ結果をテーブルに書き込む文を組み合わせたものです。 操作が完了すると、テーブルが作成され、StreamQuery インスタンスが生成され、クエリ結果が結果テーブルに書き込まれます。

説明

構文からわかるように、テーブルのフィールド情報はオプションです。 つまり、データソースの実装方法が異なると、テーブルスキーマの定義に関する要件も異なります。 具体的には、次のとおりです。
  • テーブル作成時にスキーマが指定されていない場合、データソースのスキーマは自動的に識別されます。
  • テーブル作成時にスキーマが指定されている場合、スキーマはデータソースのスキーマのサブセットである必要があり、2 つのデータタイプは同じでなければなりません。
例:
  • CREATE TABLE kafka_table 
    USING kafka 
    OPTIONS (
    kafka.bootstrap.servers = "${BOOTSTRAP_SERVERS}",
    subscribe = "${TOPIC_NAME}",
    output.mode = "${OUTPUT_MODE}",
    kafka.schema.registry.url = "${SCHEMA_REGISTRY_URL}",
    kafka.schema.record.name = "${SCHEMA_RECORD_NAME}",
    kafka.schema.record.namespace = "${SCHEMA_RECORD_NAMESPACE}");
    Kafka データソースの場合、テーブルのスキーマが指定されていない場合、対応するトピックのスキーマ定義が Kafka スキーマレジストリから自動的に取得されます。
  • CREATE TABLE kafka_table(col1 string, col2 double)
    USING kafka 
    OPTIONS (
    kafka.bootstrap.servers = "${BOOTSTRAP_SERVERS}",
    subscribe = "${TOPIC_NAME}",
    output.mode = "${OUTPUT_MODE}",
    kafka.schema.registry.url = "${SCHEMA_REGISTRY_URL}",
    kafka.schema.record.name = "${SCHEMA_RECORD_NAME}",
    kafka.schema.record.namespace = "${SCHEMA_RECORD_NAMESPACE}");

    Kafka データソースの場合、テーブルのスキーマが指定されている場合、対応するトピックのスキーマ定義が Kafka スキーマレジストリから自動的に取得されます。 続いて、フィールドの名前やタイプなど、テーブルスキーマ情報がトピックスキーマ情報と同じかどうかがチェックされます。 SQL 宣言では、外部データストレージのスキーマと同じスキーマ定義を使用することを推奨します。 具体的には、宣言テーブルのフィールドの名前とタイプは、外部テーブルのフィールドの名前とタイプと同じでなければなりません。