SQL(雅典娜)中的取消嵌套:如何将结构数组转换为从结构中提取的值数组?

Posted

技术标签:

【中文标题】SQL(雅典娜)中的取消嵌套:如何将结构数组转换为从结构中提取的值数组?【英文标题】:Unnesting in SQL (Athena): How to convert array of structs into an array of values plucked from the structs? 【发布时间】:2018-07-06 10:16:09 【问题描述】:

我从贝叶斯统计模型中抽取样本,使用 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

现在我想要的是取消嵌套父母列。此列中的每条记录都是一个结构数组。我正在尝试创建一个列,该列仅具有该结构数组中“feature_value”键的值数组。 (我想要一个数组的原因是父母数组的长度可以> 1)。

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

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

谢谢。

【问题讨论】:

【参考方案1】:

您可以使用transform 描述的here 函数。 假设我们有名为 samples 的表,其结构在您的问题中提到。然后您可以编写如下所示的查询

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

FROM samples

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

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

【讨论】:

以上是关于SQL(雅典娜)中的取消嵌套:如何将结构数组转换为从结构中提取的值数组?的主要内容,如果未能解决你的问题,请参考以下文章

将嵌套的 mongoDB 文档转换为平面 pandas DataFrame(对象数组中的对象数组)

如何将树状的数组和对象的嵌套数据结构转换为具有计算/计数 id 和跟踪父 id 的项目列表?

如何将嵌套数组对转换为数组中的对象

如何在 BigQuery 标准 SQL 中取消嵌套多个数组

如何在查询中取消嵌套嵌套表的集合?

如何将嵌套字典转换为 3D 数组