Presto/Athena - 查询以发现 JSON 属性频率?
Presto/Athena - query to discover JSON attribute frequencies?
我定义了一个 Hive table,其中单个列包含 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' = '[=12=]',
'escapeChar' = '\r'
)
STORED AS TEXTFILE
LOCATION 's3://mydata/';
是否有一个 Presto/Athena 查询可以列出 JSON 中出现的所有字段名称及其频率(即属性出现在 table 中的总次数) ?
使用 JSON functions to parse the JSON and turn it into a map. Then extract the keys and 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
- 支持多级文档
- 忽略嵌套元素的键
select key
,count(*)
from t cross join
unnest (regexp_extract_all(json,'"([^"]+)"\s*:\s*("[^"]+"|[^,{}]+)',1)) u (key)
group by key
;
我定义了一个 Hive table,其中单个列包含 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' = '[=12=]',
'escapeChar' = '\r'
)
STORED AS TEXTFILE
LOCATION 's3://mydata/';
是否有一个 Presto/Athena 查询可以列出 JSON 中出现的所有字段名称及其频率(即属性出现在 table 中的总次数) ?
使用 JSON functions to parse the JSON and turn it into a map. Then extract the keys and 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
- 支持多级文档
- 忽略嵌套元素的键
select key
,count(*)
from t cross join
unnest (regexp_extract_all(json,'"([^"]+)"\s*:\s*("[^"]+"|[^,{}]+)',1)) u (key)
group by key
;