Athena 聚合列表 struct string 字符串到字符串列表
Athena aggregate list struct string string to string list
我有一个 array<struct<string,string>>
类型的聚合数组,我想将其转换为 array<struct<string,array<string>>>
更准确地说,我有一个这样的列表
[{'a', 'b'}, {'a', 'c'}, {'d', 'e'}]
我想把它聚合起来
[{'a', ['b', 'c']}, {'d', ['e']}]
如何在 Athena 中将其转换为那样?
函数 multimap_from_entries
正是您所需要的。
查看函数的doc。
编辑:
虽然 aws 决定更新 presto :-),但这里有一个解决方法:
SELECT map_filter(reduce(array[cast(('a', 'b') AS row(one varchar, two varchar)),
cast(('a', 'c') AS row(one varchar, two varchar)),
cast(('d', 'e') AS row(one varchar, two varchar))],
map(array[cast('' as varchar)], array[array[cast('' as varchar)]]),
(s,x)-> if(s[x.one] is null, map_concat(s,map(array[x.one], array[array[x.two]])),
map_concat(s,map(array[x.one], array[s[x.one] || array[x.two]])))
, s->s), (k,v)->k <> '')
-- {a=[b, c], d=[e]}
想法是遍历数组并通过插入新的键、值对(如果键是新的)或使用新值扩展 value-array 来构造映射。
我有一个 array<struct<string,string>>
类型的聚合数组,我想将其转换为 array<struct<string,array<string>>>
更准确地说,我有一个这样的列表
[{'a', 'b'}, {'a', 'c'}, {'d', 'e'}]
我想把它聚合起来
[{'a', ['b', 'c']}, {'d', ['e']}]
如何在 Athena 中将其转换为那样?
函数 multimap_from_entries
正是您所需要的。
查看函数的doc。
编辑:
虽然 aws 决定更新 presto :-),但这里有一个解决方法:
SELECT map_filter(reduce(array[cast(('a', 'b') AS row(one varchar, two varchar)),
cast(('a', 'c') AS row(one varchar, two varchar)),
cast(('d', 'e') AS row(one varchar, two varchar))],
map(array[cast('' as varchar)], array[array[cast('' as varchar)]]),
(s,x)-> if(s[x.one] is null, map_concat(s,map(array[x.one], array[array[x.two]])),
map_concat(s,map(array[x.one], array[s[x.one] || array[x.two]])))
, s->s), (k,v)->k <> '')
-- {a=[b, c], d=[e]}
想法是遍历数组并通过插入新的键、值对(如果键是新的)或使用新值扩展 value-array 来构造映射。