0

目的

配列を含むさまざまなスキーマを持つjsonファイルでいっぱいのS3フォルダーがあります(たまたまdynamodbバックアップ)。ただし、スキーマはさまざまですが、すべてのファイルには、「id」や「name」などのいくつかの共通要素と、「selected items」などのさまざまな長さのネストされた配列が含まれています。これらの要素を自由に解析できるようにしたいと考えています。

Glueを介してサーバーレスで複製しようとしている外部ETLツール(KNIME)を使用した実用的なアプローチがあります。

バックグラウンド

作業アプローチは次のとおりです。

  1. varchar(65535)Spectrum を使用して、各 json レコードを単一のエントリとして、すべての S3 データを外部テーブルとしてロードします。
  2. json_extract_path_textやなどの Redshift SQL 関数を使用して、特定の配列など、必要な要素を解析します。json_array_length
  3. 配列インデックスの参照テーブルに対してクロス結合することにより、必要な json 配列を正規化します
  4. 必要なテーブル結合を実行し、Tableau で使用するために Redshift に書き出す

さて、これは Glue に適したタスクのように思えます。つまり、私がやりたいことは、次のいずれかです。

  1. 上記のように、Spectrum を使用してすべてのデータを読み込みます

  2. Glue で、Spectrum テーブルから動的フレームを作成します。

  3. pyspark.sql.functions.explode()Glue の Relationalize 変換などの関数を使用して、上記のように動的フレームからデータを解析します。

または:

  1. すべてのスカラー データを 1 つの Glue スキーマにクロールします (Glue がまだ JSON 配列をサポートしていない場合)
  2. 上記のアプローチのいずれかを使用して、JSON を解析し、配列を展開します。

これまでの結果

残念ながら、これらのアプローチのいずれかを機能させることができませんでした。さまざまなアプローチの阻害要因は次のとおりです。

  1. Glue を使用して json データをクロールする -この投稿によると、Glue のパーサー ヒューリスティックは、ソースのさまざまなスキーマが単一のソースに関連付けるにはあまりにも異なると判断し、それらを一連の異なるテーブルとして解析します。各ファイルを単純にクロールして、行ごとに json エントリを含むタイプ varchar(65535) の単一の列を持つテーブルを生成するクローラーがあれば十分ですが、Glue 分類子の JSON パス式はないようです。これを達成します。
  2. 「単一の varchar(65535) 列」アプローチは、データを外部テーブルとして Spectrum にロードすることで実現できますが、Spectrum テーブルを動的フレームとして Glue にロードできないようです (関連するテーブルが Glue カタログに存在することに注意してください)。ここでは、予想される varchar(65535) スキーマを持つものとして示されています)。ツェッペリン ノートブックで作業していると、

    newFrame = glueContext.create_dynamic_frame.from_catalog(database="<spectrum database>", table_name="<spectrum one column varchar table>")

    newFrame.count() = 0正常に実行されますが、とを含むテーブルが生成newFrame.toDF().show(n)されます。 n の任意の値に対して、次の形式の奇妙な出力が生成されます。

    ++ || ++ ++

    つまり、pySpark は Glue を介して Spectrum テーブルを直接操作できないようです。

  3. Crawler を使用して Spectrum テーブルをクロールします。ここでは、Redshift クラスターへの Glue 接続を介して目的のテーブルにクローラーを向けています。ただし、これにより、まだ対処できていない S3 エンドポイントの検証エラーが発生します。Crawler を Spectrum テーブルに向けることが適切なアプローチになるかどうかについては、すでにかなり確信が持てないため、VPC 構成を深く掘り下げることには消極的です。

要するに、Glue Crawler または Glue と Redshift Spectrum の組み合わせを使用して、S3 で非スカラー json を動的に取り込み、解析する方法が見つかりませんでした。これは間違いなく難解なタスクではありません。実際、dynamodb ベースの Web アプリからのデータをレポートするための比較的自動化されたアプローチが必要な場合は、これを達成する必要があります。

質問

だから私の質問は、単一のステートメントで: Glue (さらに、RS Spectrum などの別の AWS サービス) を使用して、一貫性のないスキーマを持つ S3 上の非スカラー json ファイルを解析する方法はありますか?

4

1 に答える 1