web-dev-qa-db-ja.com

SQLでのネスト解除(Athena):構造体の配列を、構造体から取り出した値の配列に変換する方法は?

私はベイジアン統計モデルからサンプルを取得し、それらをAvroでシリアル化し、S3にアップロードし、Athenaでクエリします。

テーブルの配列のネストを解除するクエリを作成するのに助けが必要です。

CREATE TABLEクエリは次のようになります。

CREATE EXTERNAL TABLE `model_posterior`(
  `job_id` bigint,
  `model_id` bigint,
  `parents` array<struct<`feature_name`:string,`feature_value`:bigint, `is_zid`:boolean>>,
  `posterior_samples` struct <`parameter`:string,`is_scaled`:boolean,`samples`:array<double>>)

「posterior_samples」列の「samples」配列は、サンプルが格納される場所です。次のクエリを使用して、 "posterior_samples"構造体のネストを解除しました。

WITH samples AS (
    SELECT model_id, parents, sample, sample_index
    FROM posterior_db.model_posterior 
    CROSS JOIN UNNEST(posterior_samples.samples) WITH ORDINALITY AS t (sample, sample_index)
    WHERE job_id = 111000020709
)
SELECT * FROM samples

enter image description here

次に、parents列のネストを解除します。この列の各レコードは、構造体の配列です。構造体の配列内の「feature_value」キーの値の配列のみを含む列を作成しようとしています。 (配列が必要な理由は、親配列の長さが> 1になる可能性があるためです)。

つまり、親行の各配列について、同じサイズの配列が必要です。その配列には、元の配列の構造体の「feature_value」キーの値のみが含まれている必要があります。

これを解決する方法に関するアドバイスはありますか?

ありがとう。

10
Count Zero

ここ で説明されているtransform関数を使用できます。あなたの質問で言及された構造を持つsamplesという名前のテーブルがあると仮定します。次に、次のようなクエリを記述できます。

SELECT *, transform(parents, parent -> parent.feature_value) as only_ feature_values

FROM samples

注:これは構文的に完全なクエリではありませんが、操作は可能です。

これがお役に立てば幸いです。乾杯:)

6
Dhaval