2017-04-10 81 views
0

我已經定義了一個蜂巢表,其中一列包含JSON文本:Presto/Athena - 查詢發現JSON屬性頻率?

CREATE EXTERNAL TABLE IF NOT EXISTS my.rawdata (
    json string 
) 
PARTITIONED BY (dt string) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' 
WITH SERDEPROPERTIES (
    'separatorChar' = '\n', 
    'quoteChar' = '\0', 
    'escapeChar' = '\r' 
) 
STORED AS TEXTFILE 
LOCATION 's3://mydata/'; 

是否有普雷斯托/雅典娜查詢可以列出了JSON內發生的所有字段名和它們的頻率(即總數該屬性出現在表中)?

+0

P.S.的鑰匙表格定義是一團糟。 OpenCSVSerde? quoteChar? escapeChar? –

回答

0

使用JSON函數解析JSON並將其轉換爲地圖。然後提取他們的密鑰和unnest。最後,使用正常的SQL聚集:

SELECT key, count(*) 
FROM (
    SELECT map_keys(cast(json_parse(json) AS map(varchar, json))) AS keys 
    FROM rawdata 
) 
CROSS JOIN UNNEST (keys) AS t (key) 
GROUP BY key 
+0

限於單級文檔 –

+0

P.不需要子查詢,UNNEST可以通過'keys'實現別名表達。 –

1
  • 支持多層次的文件
  • 忽略嵌套元素

select key 
     ,count(*) 
from  t cross join 
      unnest (regexp_extract_all(json,'"([^"]+)"\s*:\s*("[^"]+"|[^,{}]+)',1)) u (key) 
group by key 
; 
+0

工作良好,功能強大。感覺在json上使用正則表達式是錯誤的,儘管在這個問題中'json'字段實際上是一個varchar類型(hive字符串),所以正則表達式可能適合該數據類型。如你所指出的,表定義是一團糟。 – Davos

+0

另外,這個答案在另一個答案中交換了單層的限制,如果在json的多個層次中出現相同的鍵,結果將會不正確。 – Davos