手头有一大堆JSON数据需要处理?比如从日志里攒出来的、从API接口收上来的,想清理掉那些没用的字段,或者只留下关键信息,又或者单纯做一下查询。如果是在云上,阿里云Data Lake Analytics(简称DLA)可能是目前最省事的方案之一。三步走,就能把海量JSON数据的ETL流程跑起来。

第一步:JSON数据到阿里云OSS
无论用什么方式,先把JSON数据丢到OSS里。对于云上日志链路,也有专门的JSON到OSS投递方式,相关文档里讲得很清楚,这里不展开。
第二步:DLA中建表
对于分区表怎么建,有专门的方法,这里以非分区表为例。假设数据文件里每行是一个JSON,存放路径是:
oss://your_bucket/json_data/...
那么在DLA里执行建表语句:
CREATE EXTERNAL TABLE simple_json (data STRING)STORED AS TEXTFILELOCATION 'oss://your_bucket/json_data/';
第三步:利用DLA JSON函数SQL处理
json_remove
从JSON中移除指定路径的数据。可以一次处理一个路径,也可以一次处理多个。注意,目前还不支持“..”这类模糊匹配,不过预计很快会支持。
json_remove(json_string, json_path_string) -> json_stringjson_remove(json_string, array[json_path_string]) -> json_string
示例:
select json_remove('{"glossary": {"title": "example glossary","GlossDiv": {"title": "S","GlossList": {"GlossEntry": {"ID": "SGML","SortAs": "SGML","GlossTerm": "Standard Generalized Markup Language","Acronym": "SGML","Abbrev": "ISO 8879:1986","GlossDef": {"para": "A meta-markup language, used to create markup languages such as DocBook.","GlossSeeAlso": ["GML", "XML"]},"GlossSee": "markup"}}}}}', '$.glossary.GlossDiv') a;-> {"glossary":{"title":"example glossary"}}select json_remove('{"glossary": {"title": "example glossary","GlossDiv": {"title": "S","GlossList": {"GlossEntry": {"ID": "SGML","SortAs": "SGML","GlossTerm": "Standard Generalized Markup Language","Acronym": "SGML","Abbrev": "ISO 8879:1986","GlossDef": {"para": "A meta-markup language, used to create markup languages such as DocBook.","GlossSeeAlso": ["GML", "XML"]},"GlossSee": "markup"}}}}}', array['$.glossary.title', '$.glossary.GlossDiv.title']) a;{"glossary":{"GlossDiv":{"GlossList":{"GlossEntry":{"GlossTerm":"Standard Generalized Markup Language","GlossSee":"markup","SortAs":"SGML","GlossDef":{"para":"A meta-markup language, used to create markup languages such as DocBook.","GlossSeeAlso":["GML","XML"]},"ID":"SGML","Acronym":"SGML","Abbrev":"ISO 8879:1986"}}}}}
json_reserve
从JSON中保留指定路径的数据,其他全部去掉。同样支持单路径和多路径。模糊匹配目前也不支持,但后续会补上。
json_reserve(json_string, json_path_string) -> json_stringjson_reserve(json_string, array[json_path_string]) -> json_string
示例:
select json_reserve('{"glossary": {"title": "example glossary","GlossDiv": {"title": "S","GlossList": {"GlossEntry": {"ID": "SGML","SortAs": "SGML","GlossTerm": "Standard Generalized Markup Language","Acronym": "SGML","Abbrev": "ISO 8879:1986","GlossDef": {"para": "A meta-markup language, used to create markup languages such as DocBook.","GlossSeeAlso": ["GML", "XML"]},"GlossSee": "markup"}}}}}', array['$.glossary.title']) a;-> {"glossary":{"title":"example glossary"}}select json_reserve('{"glossary": {"title": "example glossary","GlossDiv": {"title": "S","GlossList": {"GlossEntry": {"ID": "SGML","SortAs": "SGML","GlossTerm": "Standard Generalized Markup Language","Acronym": "SGML","Abbrev": "ISO 8879:1986","GlossDef": {"para": "A meta-markup language, used to create markup languages such as DocBook.","GlossSeeAlso": ["GML", "XML"]},"GlossSee": "markup"}}}}}', array['$.glossary.title', '$.glossary.GlossDiv.title', '$.glossary.GlossDiv.GlossList.GlossEntry.ID']) a;-> "glossary":{"title":"example glossary","GlossDiv":{"GlossList":{"GlossEntry":{"ID":"SGML"}},"title":"S"}}}