在SQL(Athena)中进行嵌套:如何将结构数组转换为从结构中提取的值数组?

Cou*_*ero 8 sql row avro unnest amazon-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>>)
Run Code Online (Sandbox Code Playgroud)

“ 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
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

现在,我想要的是取消嵌套父母栏。此列中的每个记录都是一个结构数组。我试图创建一个仅包含该结构数组中“ feature_value”键的值数组的列。(我之所以想要一个数组,是因为parents数组的长度可以> 1)。

换句话说,对于父行中的每个数组,我想要一个大小相同的数组。该数组应仅包含原始数组中结构的“ feature_value”键的值。

关于如何解决这个问题的任何建议?

谢谢。

Dha*_*val 6

您可以使用此处transform描述的功能。假设我们有以您的问题中提到的结构命名的表。然后您可以编写如下所示的查询samples

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

FROM samples
Run Code Online (Sandbox Code Playgroud)

注意:这在语法上不是完美的查询,但您可以使用它。

希望这会有所帮助。干杯:)