Presto:将array <struct <key:string,value:array <string >>>转换为map <string,array <string >>

时间:2018-10-25 15:53:08

标签: sql hive presto

我有一个类似

的表格
name            string                                      
address         string                                      
timezone        string                                      
one_key_value   array<struct<key:string,value:array<string>>                    
two_key_value   array<struct<key:string,value:array<string>>

并希望将其转换为

name            string                                      
address         string                                      
timezone        string                                      
one_key_value   map<string,array<string>>                       
two_key_value   map<string,array<string>>

使用presto。有lateral view inline,但实际上并没有真正起作用。我该怎么办?

2 个答案:

答案 0 :(得分:2)

根据提供的信息,您基本上需要两件事:

  1. 升级到最新版本-来自Maven Central / Github,或者来自https://www.starburstdata.com/starburst-presto-sql/的受Starburst支持(免费)的发行版(免责声明:我来自Starburst)。 0.175确实有点过时了。
  2. 使用map_from_entries(one_key_value)(文档:https://prestosql.io/docs/current/functions/map.html#map_from_entries

答案 1 :(得分:1)

我还没有检验过思想,但是下面的表达应该有所帮助:

map( transform(one_key_value, e -> e.key), transform(one_key_value, e -> e.value))
map( transform(two_key_value, e -> e.key), transform(two_key_value, e -> e.value))

根据Presto 0.175 docs的AS:

  

map(array,array)→map返回使用   给定键/值数组。

     

SELECT映射(ARRAY [1,3],ARRAY [2,4]); -{1-> 2,3-> 4}

我们可以使用array transform function从输入字段(array<struct<key:string,value:array<string>>)构建键和值的数组

  

transform(array,function)→ARRAY返回一个数组   将函数应用于数组的每个元素