繁体   English   中英

在 Athena 中,如何查询结构体数组中结构体的成员?

[英]In Athena how do I query a member of a struct in an array in a struct?

我试图找出如何查询我在哪里检查的值usage如下表创建:

CREATE EXTERNAL TABLE IF NOT EXISTS foo.test (
     `id` string,
     `foo` struct< usages:array< struct< usage:string,
     method_id:int,
     start_at:string,
     end_at:string,
     location:array<string> >>> 
) PARTITIONED BY (
         timestamp date 
) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
         'serialization.format' = '1' ) LOCATION 's3://foo.bar/' TBLPROPERTIES ('has_encrypted_data'='false');

我想有一个查询,如:

SELECT * FROM "foo"."test" WHERE foo.usages.usage is null;

当我这样做时,我得到:

SYNTAX_ERROR:第 1:53 行:表达式“foo”.“usages”不是 ROW 类型

如果我在直接索引数组的位置进行查询,如下所示。

SELECT * FROM "foo"."test" WHERE foo.usages[1].usage is null;

我的总体目标虽然是在跨所有项目查询usages阵列,并找到其中的至少一个项目的任何行usages阵列有一个成员usage是空。

Athena 基于 Presto。 在 Presto 318 中,您可以使用any_match

SELECT * FROM "foo"."test"
WHERE any_match(foo.usages, element -> element.usage IS NULL);

我认为该功能在 Athena 中尚不可用,但您可以使用reduce来模拟它。

SELECT * FROM "foo"."test"
WHERE reduce(
  foo.usages, -- array to reducing
  false, -- initial state
  (state, element) -> state OR element.usage IS NULL, -- combining function
  state -> state); -- output function (identity in this case)

您可以通过将数组取消嵌套到行中,然后检查这些行中的null值来实现这一点。 这将导致每个null值条目一行。

select * from test
CROSS JOIN UNNEST(foo.usages) AS t(i)
where i.usage is null

因此,如果您只需要唯一集,则必须通过 select distinct 运行它。

select distinct id from test
CROSS JOIN UNNEST(foo.usages) AS t(i)
where i.usage is null

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM