在SQL中无法解决(Athena):如何将结构数组转换为从结构中提取的值数组?

时间:2018-01-27 02:51:34

标签: sql row avro amazon-athena unnest

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

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

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

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

感谢。

1 个答案:

答案 0 :(得分:2)

您可以使用transform所述的samples功能。 假设我们在您的问题中提到了具有结构的SELECT *, transform(parents, parent -> parent.feature_value) as only_ feature_values FROM samples 表。然后,您可以编写类似于以下内容的查询

shell_exec('php . php-file.php');

注意:这很多都不是语法上完美的查询,但你可以使用它。

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