天天看點

隻要三步!阿裡雲DLA幫你處理海量JSON資料

概述

您可能有大量應用程式産生的JSON資料,您可能需要對這些JSON資料進行整理,去除不想要的字段,或者隻保留想要的字段,或者僅僅是進行資料查詢。

那麼,利用阿裡雲Data Lake Analytics或許是目前能找到的雲上最為便捷的達到這一目标的服務了。僅僅需要3步,就可以完成對海量JSON資料的處理,或者更為複雜的ETL流程。

第一步:JSON資料到阿裡雲OSS

利用各種手段,将JSON資料投遞到OSS

https://www.aliyun.com/product/oss

)中。

通常,對于雲上日志鍊路,還有一種JSON到OSS的投遞鍊路,可以參考

“雲原生日志資料分析上手指南”

其中的JSON部分。

第二步:DLA中建表

參考上述

,其中已經有海量JSON資料的分區模式建表方法了。本例中,以非分區表為例,假設,資料檔案中每一行一個JSON資料,JSON資料放置的OSS路徑為:

oss://your_bucket/json_data/...
           

則,在DLA中執行建表:

CREATE EXTERNAL TABLE simple_json (
    data STRING
)
STORED AS TEXTFILE
LOCATION 'oss://your_bucket/json_data/';
           

第三步:利用DLA JSON函數SQL處理

json_remove

從JSON中去除指定JSON Path的資料。可以一次處理一個JSON path,也可以一次處理多個JSON path。注意:目前還不支援“..”等JSON path的模糊比對,不久後會支援。

json_remove(json_string, json_path_string) -> json_string
json_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 Path的資料,去除其他的資料。可以一次處理一個JSON path,也可以一次處理多個JSON path。注意:目前還不支援“..”等JSON path的模糊比對,不久後會支援。

json_reserve(json_string, json_path_string) -> json_string
json_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"}}}
           

後記

還可以利用Data Lake Analytics強大的雲上資料處理能力,進行多源資料融合處理、分析,回流到其他資料庫、存儲系統中。

更多資訊請參考:

https://datalakeanalytics.console.aliyun.com/overview

Data Lake Analytics首購和流量包優惠

首購使用者1元10TB,流量包階梯折扣優惠:

https://et.aliyun.com/bdad/datalake

産品詳情:

https://www.aliyun.com/product/datalakeanalytics

雲栖社群:

https://yq.aliyun.com/teams/396

知乎社群:

https://zhuanlan.zhihu.com/data-lake-analytics