問題タブ [amazon-redshift-spectrum]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
1340 参照

amazon-redshift - 赤方偏移スペクトルを使用してS3でデータカタログテーブルを表示する方法

AWS グルーでデータベースの外部スキーマを作成しました。テーブルの一覧は表示されますが、json データを調べることができません。redshift はこのエラーをスローします。

外部テーブルを作成したくないのは、aws グルーでデータ カタログ内の外部テーブルを組み合わせたビューを作成するためです。

ただの更新:

データカタログにテーブルを作成する際に、aws グルークローラーを使用しました。それらはjson形式です。このデータを redshift にアップロードするジョブを使用すると、それらは redshift テーブルにフラット ファイル (配列を除く) としてロードされます。

json データの例:

aws グルーのジョブを使用してそれらをアップロードすると、出力は次のようになります (テーブルとして)

画像を見る

現在、膨大な量のテーブルがデータ カタログでクロールされています。このテーブルの個々のスクリプトを作成するのに苦労しているため、Amazon Redshift Spectrum 外部スキーマが役立つ可能性があります。

ただし、外部スキーマで外部テーブルをクエリすると、上記のエラーが発生します。データ カタログの外部テーブルが csv として読み込まれている場合、問題は発生しませんが、redshift スペクトルで読み取る必要がある形式のファイルは json である必要があります。

ジョブを使用してロードされたときに、外部テーブルを同じ形式の赤方偏移スペクトルで表示することは可能ですか?

0 投票する
1 に答える
2052 参照

amazon-web-services - AWS Glue: さまざまなスキーマで非スカラー JSON を ETL する方法

目的

配列を含むさまざまなスキーマを持つ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 ファイルを解析する方法はありますか?