2015-04-29 32 views
5

JSON數組給定一個表,其中包含JSON的這樣一列:如何跨越加入UNNEST在急

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

我如何寫一個普雷斯托查詢給我所有的平均b值項?

到目前爲止,我認爲我需要使用像Hive的lateral view explode,其在Presto中相當於cross join unnest

但我被困在如何編寫cross join unnest的Presto查詢。

如何使用cross join unnest擴展所有數組元素並選擇它們?

回答

3

加正如你指出的那樣,這是終於在普雷斯托0.79實施。 :)

這裏是here的語法投的一個例子:

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

建議的特殊字,存在不普雷斯托「字符串」型像有在蜂巢。 這意味着如果你的數組包含字符串,請確保使用'varchar'類型,否則你會得到一個錯誤消息,說'類型數組不存在',這可能會引起誤解。

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

值不能被轉換爲數組(varchar) – colintobing

0

下面是該

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一個例子定義了別名爲message

VALUES返回逐字表行集

列公用表表達式(CTE)名稱exampleUNNEST正在單行和returni的列中取數組將數組的元素分成多行。

CAST正在將JSON類型更改爲UNNEST所需的ARRAY類型。它很容易就是ARRAY<MAP<,但我發現ARRAY(ROW(更好,因爲您可以指定列名稱,並在select子句中使用點符號。

JSON_EXTRACT使用jsonPath表達式返回​​鍵

avg()group by應該熟悉SQL的數組值。

+0

該問題指定了Presto,但是如果使用Athena,它似乎將轉換爲'ARRAY(ROW('和其他一些複雜類型不被支持,所以使用'ARRAY(MAP(VARCHAR ,VARCHAR))'而不是在select和group by子句中引用諸如'xn ['type']'等的值 – Davos