Back to Blog
TutorialMay 2, 202210分

データフォーマット地獄を打破せよ

複雑なデータフォーマットやその変更に対処することは困難です。 layline.ioがどのようにしてこの課題に取り組むか、設定可能な文法言語を使用して学びましょう。

データフォーマット地獄を打破せよ

セッティング

あなたはACME Corpでデータ処理インフラストラクチャを管理・運営する役割を担っています。これは会社の中で重いデータ処理を行う複雑で繊細な機械でありながら、その努力が報われることはありません。それは止まることなくポンプし続けるポンプであり、物事を動かし続けるジュースです。

しかし、両親や友人、さらには同僚にACMEで何をしているのかを説明すると、彼らはあなたの熱心な説明の途中で眠りに落ちてしまいます。

正直に言いましょう:あなたが世界のためにしていることに対して、十分な評価を受けていません 🙃

課題

あなたの仕事は機械工の服を着て走り回ることを要求されるわけではありませんが、データ処理インフラストラクチャを常に観察し、修正し、調整し、新しい活力を注入する必要があると感じることは確かです。

日々の課題は多くありますが、その中の一つは変更についてです。動いているシステムを変えるなと言われますが、それでは世界は回りません。より頻繁に起こる変更の一つは…

データフォーマットの変更

AAHHHH! 赤色警報…サイレンが鳴り響く…! データフォーマットの変更に関しては、多くの課題が同時に発生することがよくあります:

  1. データインターフェースはしばしばソースコードにハードコーディングされています。ボスが提案するように「変更」することはできません、少なくともそれは簡単ではありません。
  2. 移行中、データは古いフォーマットと新しいフォーマットの両方で受け取られます。小さな変更であっても、それは依然として並行して処理される必要がある2つの異なるフォーマットです。
  3. 単なる別のフィールドの問題ではありません。時には、完全に新しいデータ構造や他の多くのことが同時に追加されることもあります。
  4. 変更されたデータは、追加の情報の内部処理を必要とする場合があります。再び、コードがハードコーディングされている可能性があり、対応するためにコードを変更する必要があります。
  5. コーヒーが切れた。それは助けになりません。

ここには2つの主要な問題があります:

  1. コードの変更と
  2. フォーマット移行の処理。

これはかなりの頭痛の種となり、計画、開発、リリース、テスト、そして最終的なデプロイメントの長いサイクルを必要とすることがあります。

これを迅速かつ簡単に行うためのより良い方法があれば…

ジェネリックデータフォーマットが救いに

layline.ioはジェネリックデータフォーマットを備えており、上記の課題すべてを解決することはできませんが、ほとんどの課題をほとんどの時間で解決します。

ジェネリックデータフォーマットとは?

名前が示すように、この概念はデータフォーマットをジェネリックな方法で定義することを可能にします。これを行うために、以下を提供します:

  1. 格闘しようとしているフォーマットの構造(文法)を定義するための言語。
  2. この言語は正規表現を使用して構造の個々の要素を定義および識別し、次に
  3. その構造のサブ要素などを定義します。
  4. オブジェクト指向であり、要素構造を定義して再利用することができます。

その言語はどのように見えるのか?

見てみましょう。この目的のために、カンマで区切られた、1つのヘッダーレコード、1..nの詳細レコード、トレーラーレコードを持つ非常にシンプルなデータフォーマットを使用します。

シンプルな銀行取引ログの例データ:

H;Sample Bank Transactions
D;20-Aug-2021;NEFT;23237.00;00.00;37243.31
D;21-Aug-2021;NEFT;00.00;3724.33;33518.98
T;100

そして、layline.io内でこのフォーマットがジェネリックな文法言語を使用してどのように定義されているかは以下の通りです:

format {
  name = "Bank Transactions" 
  description = "Random bank transactions"

  start-element = "File"
  target-namespace = "BankIn"

  elements = [
    // File sequence
    {
      name = "File"
      type = "Sequence"
      references = [
        { name = "Header", referenced-element = "Header" },
        { name = "Details", max-occurs = "unlimited", referenced-element = "Detail" },
        { name = "Trailer", referenced-element = "Trailer" }
      ]
    },
    // Header record 
    {
      name = "Header"
      type = "Separated"
      regular-expression = "H"
      separator-regular-expression = ";"
      separator = ";"
      terminator-regular-expression = "\n"
      terminator = "\n"
      mapping = { message = "Header", element = "BT_IN" }
      parts = [
        { name = "RECORD_TYPE", type = "RegExpr", regular-expression = "[^;\n]*", value.type = "Text.String" },
        { name = "FILENAME", type = "RegExpr", regular-expression = "[^;\n]*", value.type = "Text.String" }
      ]
    },
    // Detail record
    {
      name = "Detail"
      type = "Separated"
      // ... similar structure
    },
    // Trailer record
    {
      name = "Trailer"
      type = "Separated"
      // ... similar structure
    }
  ]
}

format要素

すべてはトップレベルのformat要素から始まります:

namedescriptionの他に、elementsの配列も持っています。これらの要素は異なるタイプのサブ要素(クラス)を定義します。

SequenceタイプのFile要素

この要素は、そのreferences構造内でサブ要素の論理構造を定義します:

ここでツリーを構築していることがわかるかもしれません:

予備的な結論

文法言語の動作方法について学んだことは以下の通りです:

  1. 文法は多数の要素で構成されます
  2. これらの要素は異なるタイプがあり、それぞれ異なる目的を持っています
  3. 初期要素はformatであり、開始要素を指します
  4. 任意の数の追加要素を定義できます
  5. 一部の要素は他の要素を参照できます

他のより複雑なフォーマットはどうでしょう?

他に機能するものは次の通りです:

  • 非常に複雑なASCII/Unicodeフォーマット
  • 条件付きパーサー状態を管理することによる条件付きデータ解析
  • バイナリ構造
  • ASCIIとバイナリフォーマットの混合

これにより、すべてのデータ交換フォーマットの80%以上をカバーできると信じています。

複数フォーマットのサポート

好きなだけ多くのフォーマットを定義できます。layline.ioはすべてをランタイムで「スーパー・フォーマット」にコンパイルします。これにより、以下が可能になります:

  • どこからでもすべてのフォーマットを参照する
  • あるフォーマットから別のフォーマットにデータをマッピングする
  • 特定のフォーマットに基づいて新しいメッセージインスタンスを作成する
  • 定義されたフォーマットのいずれかでデータを取り込むまたは出力する

実際にこれをどこで設定するのか?

すべての設定を行うための素晴らしいユーザーインターフェースを提供しています。layline.ioのウェブベースのConfiguration CenterでProject --> Formats --> Generic Formatの下にあります:

そしてそれだけではありません。文法を定義している間に、サンプルデータファイルをアップロードし、文法がデータファイル構造に一致しているかを並べて確認できます:

かなりクールですね?

ロジック内でのデータ参照

layline.io内で1つ以上の文法を定義したら、その中の個々の要素や構造にアクセスできます:

例:Mapping Asset内でのデータアクセス

例:Javascript Asset内でのデータアクセス

フォーマット変更への対応

冒頭で話した課題を振り返ると、フォーマット変更に適応するのがいかに簡単かがより明確になるはずです。

  • 別のフィールドが必要ですか?文法に追加するだけです。
  • 別の全体的なレコード構造が必要ですか?これもまた、文法に追加するだけです。
  • 古いバージョンと新しいバージョンのDetailレコードの両方を同時に対応する必要がありますか?簡単です:Choice要素を挿入して、Detail-OldまたはDetail-Newバージョンのいずれかを許可できます。
  • 他のコンテンツに基づいてコンテンツを計算する必要がありますか?単に数式を追加するだけです。

すべてが処理されています。

リソース

#説明
1Documentation: Getting Started
2Documentation: Generic Format Asset
3サンプルプロジェクト: Output to Kafka
Share:

Enjoyed this article?

Subscribe to get more insights delivered to your inbox.