Avro スキーマの型の再利用

Avro スキーマは、Apache Avro 形式で保存するレコードの構造とデータ型を定義する正式な仕様です。Apache Avro 形式は、Apache Hadoop や Apache Kafka などのビッグデータシステムでよく使用されるデータシリアル化システムです。Avro スキーマにより、関与するプログラミング言語やプラットフォームに関係なく、Avro に書き込まれたデータを容易に理解したり、異なるシステム間で処理したりできます。

Avro スキーマは JSON データ形式で定義されます。​avroschema!​ モジュールローダーを使用して、Avro スキーマファイル (​.json​ または ​.avsc​) をモジュールとして DataWeave スクリプトにインポートできます。このローダーにより、各自のスキーマで宣言されている型を DataWeave で直接使用できます。 DataWeave は、Avro スキーマファイルを読み込み、ファイルの宣言を他の DataWeave モジュールの型と同じようにアクセスできる DataWeave 型ディレクティブに変換します。ディレクティブを使用して、新しい型を作成したり、変数の型をチェックしたり、パターンを照合したり、型を使用する新しい関数を宣言したりします。DataWeave では、これらの型の使用方法に制限はありません。

インポート構文

Avro スキーマで定義されている型をインポートするには、以下の構文を使用します。

  • typeToImport​: *​ を使用してスキーマで定義されているすべての型をインポートしたり、スキーマの 1 つの型 (​Root​ など) をインポートしたりします。スキーマでは、スキーマで指定された名前を Avro 名前付き型 (​record​ や ​enum​ など) で使用します。異なる名前の Avro スキーマの型 (​Root as Country​ など) をインポートすることもできます。スクリプトでその名前を使用して型を参照できます。

  • pathToAvroSchemaFile​: スキーマファイルへのパスを指定するには、ファイルの区切り文字を ​::​ に置き換えて、ファイル名の拡張子 (​.json​ または ​.avsc​) を削除します。たとえば、スキーマへのパスが ​example/schema/User.json​ の場合、​example::schema::User​ を使用します。

import _typesToImport_ from avroschema!_pathToAvroSchemaFile_

次の例は、型をインポートする方法を示しています。

import * from avroschema!example::schema::User

DataWeave スクリプトでの型の使用

次の例では Avro スキーマを使用します。

User.json (​example/schema/User.json​)
{
  "name": "User",
  "type": "record",
  "fields": [
    {"name": "name", "type": "string" },
    {"name": "email", "type": "string" },
    {"name": "address", "type": ["null", "string"]},
    {"name": "telephone", "type": ["null", "string"]}
  ]
}
JSON

前の例の import ディレクティブをスクリプトヘッダーに含めると、Avro スキーマの既存の型が読み込まれます。​import * from avroschema!example::schema::User​ では、唯一の既存の型は、ルートで指定された ​User​ 型です。この型は、4 つのプロパティ (​name​、​email​、​address​、​telephone​) を持つオブジェクトを記述します。このディレクティブは、DataWeave スクリプトで次の型を宣言することに相当します。

DataWeave スクリプト:
%dw 2.0
type User = {| name: String, email: String, address?: Null | String, telephone?: Null | String |}
dataweave

address​ と ​telephone​ は省略可能な項目 (​?​ で示される) です。

User​ 型を使用して、値が Avro スキーマで定義された構造に従っているかどうかを判断できます。 次の例では、オブジェクトに必須項目 ​name​ および ​email​ が含まれているため、値 ​true​ が出力されます。

DataWeave スクリプト:
%dw 2.0
import * from avroschema!example::schema::User
---
{
 name: "John",
 email: "john@acme.org"
} is User
dataweave
出力:
"true"

次の例では、オブジェクトに必須項目 ​name​ が含まれていないため、値 ​false​ が出力されます。

DataWeave スクリプト:
%dw 2.0
import * from avroschema!example::schema::User
---
{
 email: "john@acme.org",
 address: "123 Evergreen St.",
 telephone: "555 555 555"
} is User
dataweave
出力:
"false"

スキーマ内での名前付き型の使用

DataWeave はスキーマで定義された名前付き型ごとに個別の型を生成します。名前付き型には、レコード、列挙、および固定型があります。

Address.json (​example/schema/Address.json​)
{
  "name": "Address",
  "type": "record",
  "fields" : [
    {"name": "city", "type": "string"},
    {"name": "state", "type": "string"},
    {
      "name": "country",
      "type": {
        "name": "Country",
        "type": "record",
        "fields": [
          {"name":  "isoCode", "type": "string"},
          {"name":  "name", "type": "string"}
        ]
      }
    }
  ]
}
JSON

次のディレクティブを使用して、前のスキーマの型をインポートできます。

import * from avroschema!example::schema::Address

スキーマで定義された型には、次の型の宣言と同じ効果があります。

type Address = {| city: String, state: String, country: Country |}

type Country = {| isoCode: String, name: String |}

インポートディレクティブを使用して、スキーマの 1 つの型をインポートします。

import Country from avrochema!example::schema::Address

型名の競合を回避するために、​as​ キーワードを使用して、インポートされた型名を別の名前に変更できます。

import Country as Address_Country from avroschema!example::schema::Address