2015-04-29 17 views
5

Given tabeli zawierającej kolumnę JSON tak:jak przejechać dołączyć unnest tablicy json w presto

{"payload":[{"type":"b","value":"9"}, {"type":"a","value":"8"}]} {"payload":[{"type":"c","value":"7"}, {"type":"b","value":"3"}]}

Jak mogę napisać zapytanie Presto dać mi średnią b wartość we wszystkich wpisy?

Do tej pory myślę, że muszę użyć czegoś takiego jak Hive's lateral view explode, którego odpowiednikiem jest cross join unnest w Presto.

Ale utknąłem na tym, jak napisać zapytanie Presto dla cross join unnest.

Jak mogę użyć cross join unnest, aby rozwinąć wszystkie elementy tablicy i wybrać je?

Odpowiedz

3

Jak podkreślił, to ostatecznie wdrożone w Presto 0,79. :)

Oto przykład składni obsady z here:

select cast(cast ('[1,2,3]' as json) as array<bigint>); 

specjalna rada, nie ma „string” wpisz Presto jak jest w ula. Oznacza to, że jeśli twoja tablica zawiera ciągi, upewnij się, że używasz typu "varchar". W przeciwnym razie pojawi się komunikat o błędzie z informacją, że "tablica typów nie istnieje", co może być mylące.

select cast(cast ('["1","2","3"]' as json) as array<varchar>); 
+0

Wartość nie może być rzutowana na tablicę (varchar) – colintobing

0

Oto przykładem

with example(message) as (
VALUES 
(json '{"payload":[{"type":"b","value":"9"},{"type":"a","value":"8"}]}'), 
(json '{"payload":[{"type":"c","value":"7"}, {"type":"b","value":"3"}]}') 
) 


SELECT 
     n.type, 
     avg(n.value) 
FROM example 
CROSS JOIN 
    UNNEST(
      CAST(
       JSON_EXTRACT(message,'$.payload') 
        as ARRAY(ROW(type VARCHAR, value INTEGER)) 
        ) 
       ) as x(n) 
WHERE n.type = 'b' 
GROUP BY n.type 

with określa wyrażenie tabelowym (CTE) Nazwy example z kolumną aliasie message

VALUES powraca dosłownym stolik zestaw wierszy

UNNEST pobiera tablicę w kolumnie pojedynczego wiersza i returni ng elementy tablicy jako wiele wierszy.

CAST zmienia typ JSON na typ ARRAY wymagany dla UNNEST. Mogłoby to być z łatwością ARRAY<MAP<, ale uważam, że jest ono ładniejsze, ponieważ można określać nazwy kolumn i używać notacji kropek w klauzuli select.

JSON_EXTRACT używa wyrażenia jsonPath aby zwrócić wartość tablicę payload kluczowego

avg() i group by powinien znać SQL.

+0

Pytanie określa Presto, jednak w przypadku użycia Ateny, pojawia się rzutowanie na 'ARRAY (ROW (' i niektóre inne złożone typy nie są obsługiwane, więc użyj 'ARRAY (MAPA (VARCHAR) , VARCHAR)) 'zamiast tego w klauzuli select i group by odwołują się do wartości takich jak' xn ['type'] 'etc – Davos