我试图弄清楚如何在下面的表创建中查询我在哪里检查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;
型
当我这样做时,我得到:
语法错误:第1行:53:表达式“foo”.“usages”不是ROW类型
如果我在直接索引数组的地方进行查询,如下图所示,它可以工作。
SELECT * FROM "foo"."test" WHERE foo.usages[1].usage is null;
型
我的总体目标是查询usages
数组中的所有项目,并找到usages
数组中至少有一个项目的成员usage
为null的任何行。
3条答案
按热度按时间scyqe7ek1#
Athena基于Presto。在Presto 318中,您可以使用
any_match
:字符串
我想Athena中还没有这个功能,但是你可以使用
reduce
来模拟它。型
rn0zuynd2#
您可以通过将数组取消嵌套到行中,然后检查
null
值来实现这一点。这将导致每个null
值条目一行。字符串
因此,如果您只需要唯一的集合,则必须通过
SELECT DISTINCT
运行此操作。型
1u4esq0p3#
另一种模拟
any_match(<array>, <function>)
的方法是使用cardinality(filter(<array>, <function>)) > 0
。字符串
变成:
型