スキーマレスJSONからApacheBeamの「行」タイプ?
Java SDKを使用して、スキーマのない任意のJSON文字列をApache Beamの「行」タイプに変換する方法はありますか?そうでない場合、既存のオブジェクトからビームスキーマタイプを導出することは可能ですか?
JsonToRowとParseJsonsのドキュメントを見つけましたが、機能するにはスキーマまたはPOJOクラスを提供する必要があります。また、JSON文字列をBigQuery TableRowに読み込むことができることもわかりましたが、TableRowをRowに変換する方法はなく、スキーマがすでに存在しないようです。
回答
いいえ、これは不可能です。Row(およびそれを使用するフレームワーク)は構築時にスキーマを知っている必要があるためです。オプションとして、構築時に、データのごく一部を読み取ってスキーマを推測し、これを使用してJsonToRowトランスフォームを呼び出すことができます。
残念ながら、一般的な答えは「いいえ」のように見えますが、答えが「はい」になる特定の状況がいくつかあります。
問題は、特にARRAYフィールドタイプのために、スキーマがJSONデータ型と100%互換性がないことです。
JSONでは、リストの要素のデータ型が異なる場合がありますが、Beamのスキーマでは、各要素が同じ型であるためにARRAYである必要があります。この型は別のROWでも論理型でもかまいませんが、すべての要素が同じである必要があります。
残念ながら、ROWを使用してARRAYを置き換えることは完全には機能しません。 ROWフィールドは定位置ですが、名前も付けられているため、MAPに近くなります。さらに、データセットに異なる長さのJSONリストが含まれている場合、各行に異なるスキーマが含まれることになり、望ましくない結果が生じます。
したがって、JSONデータが任意のタイプのリストを使用しない場合は、問題ないはずです。とはいえ、BeamはJSONからスキーマを派生させるためのユーティリティを提供していないため、そのソリューションを自分で作成する必要があります。
私は仕事でこの正確な状況に遭遇しています、そして私はあなたが限られたJSON処理オプションについて言ったすべてを2番目にしています。Beamは、BigQuery TableRow / TableSchemaをBeamRow / Schemaに変換できるものを提供していることがわかりました。これをスキーマとして選択してJsonToRowを続行する場合は、BigQueryUtils.fromTableSchemaによって生成されたJSONデータ型とBeamデータ型(BYTES、DATETIME、BigQueryUtilsによって生成された論理型)間のデータ型インピーダンスの不一致を埋める必要があります。