web-dev-qa-db-fra.com

Presto: cast tableau <struct <clé: chaîne, valeur: tableau <chaîne >>> dans la carte <chaîne, tableau <chaîne >>

J'ai une table comme 

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>>

et voulez le convertir en 

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

en utilisant presto. Il existe lateral view inline mais cela ne fonctionne pas vraiment dans presto. Comment puis-je faire ceci?

5
John Constantine

Sur la base des informations fournies, vous avez essentiellement besoin de deux choses:

  1. Passez à quelque chose de plus récent - le dernier de Maven Central/Github, ou une distribution (et gratuite) supportée par Starburst de https://www.starburstdata.com/starburst-presto-sql/ (disclaimer: Je suis de Starburst) . 0,175 est vraiment un peu obsolète.
  2. Utilisez map_from_entries(one_key_value) (docs: https://prestosql.io/docs/current/functions/map.html#map_from_entries )
2
Piotr Findeisen

Je n'ai pas testé la pensée, mais l'expression ci-dessous devrait aider:

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))

AS par Presto 0,175 docs :

map (tableau, tableau) → map Retourne une carte créée à l'aide du fichier des tableaux clé/valeur donnés.

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

Nous pouvons utiliser fonction de transformation de tableau pour construire le tableau de clés et de valeurs à partir du champ de saisie (array<struct<key:string,value:array<string>>)

transform (tableau, fonction) → ARRAY Renvoie un tableau qui applique la fonction à chaque élément du tableau

1
skadya