Sql 在雅典娜中,如何查询结构中数组中的结构成员?

Sql 在雅典娜中,如何查询结构中数组中的结构成员?,sql,json,presto,amazon-athena,Sql,Json,Presto,Amazon Athena,我正在尝试找出如何查询我在何处检查用法的值,前提是创建以下表格: 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<str

我正在尝试找出如何查询我在何处检查
用法
的值,前提是创建以下表格:

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');
当我这样做时,我得到:

语法错误:第1:53行:表达式“foo”。“usages”不是ROW类型

如果我在直接索引数组的地方进行查询,如下图所示,它会工作

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

不过,我的总体目标是跨
usages
数组中的所有项进行查询,并查找
usages
数组中至少有一项的成员
usage
为空的任何行。

可以通过将数组取消设为行,然后检查
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

雅典娜以普雷斯托为原型。在Presto 318中,您可以使用:

我认为这个函数在雅典娜中还不可用,但是你可以用它来模拟


我的直觉表明,UNNEST+DISTINCT不是最有效的选择。即使Athena获得了最不必要的优化(),DISTINCT对于更大的数据集来说可能仍然是昂贵的。确实,
任何匹配项在Athena中都不可用,这需要一个小的更改才能为我工作。。。我不得不将
|
替换为
关键字(否则它将其视为数组连接运算符)@Anentropic right!。。每天都有太多的Java。已更新,谢谢。
任何匹配项仍不可用。有关雅典娜中所有可用Presto函数的列表:
select distinct id from test
CROSS JOIN UNNEST(foo.usages) AS t(i)
where i.usage is null
SELECT * FROM "foo"."test"
WHERE any_match(foo.usages, element -> element.usage IS NULL);
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)