JSON做爲一種輕量級的數據交換格式,因其易於讀寫和交互的特色,已逐漸成爲主流的數據類型之一。常見的編程語言大多都對 JSON 的讀取與解析提供了接口,可是接下來如何把多層 JSON 數據通過篩選、計算並展開成二維數據,就須要開發人員去頭疼了。本文就爲你們分享一下如何利用集算器 SPL(結構化處理語言)輕鬆解決 JSON 數據解析入庫的問題。數據庫
JSON 數據文件導入與解析編程
根據 JSON 數據文件的複雜程度,以及不一樣的需求,咱們會分三種狀況來討論:json
1. 單層的 JSON 數據文件數據結構
咱們先從一個簡單的例子入手,看看普通鍵值映射的 JSON 文件如何讀取。下面是某產品訂單信息的 JSON 數據文件:編程語言
SPL導入 JSON 數據文件只須要簡單的一句腳本:函數
= json(file("product.json").read())工具 |
不須要寫循環函數,也不用解析 JSON 對象,執行一下就能夠看到,JSON 數據文件已經轉換爲二維數據序表了:spa
2. 明細數據相同結構的多層 JSON 數據文件設計
接下來,咱們看一下多層的 JSON 文件如何處理。下面是咱們要用到的 JSON 數據文件 orders.json:對象
能夠看到,JSON 數據分爲兩層,第一層是 "貨主國家" 和 "貨主地區",第二層是明細數據。如今咱們想要從中導入中國華北和華南地區 2013 年的訂單,讓咱們看看若是用 SPL 實現。
此次咱們先來定義一下參數:Country、Area 和 Year,分別對應須要導入的貨主國家、貨主地區和訂購日期的年份。經過定義參數,之後導入不一樣國家、地區和年份的時候,就再也不須要修改 SPL,只須要提供相應的參數值就好了。這裏須要注意的是,Area 的值是序列,默認值是 [華北, 華南],這樣就能夠同時讀取多個地區的數據。以下圖:
咱們先看一下 SPL 腳本:
A |
B |
|
1 |
=json(file("orders.json").read()) |
=A1.select(貨主國家 ==Country && Area.contain( 貨主地區)) |
2 |
=B1.news(區域訂單;B1. 貨主國家: 貨主國家,B1. 貨主地區: 貨主地區,#1,#2,#3,#4,#5,#6,#7,#8,#9,#10,#11,#12,#13) |
=A2.select(year( 訂購日期)==Year) |
下面來詳細解釋一下:
第一步:A1 中 =json(file("orders.json").read()),導入 JSON 文件生成序表。執行一下,能夠看到 JSON 數據按層級被展示出來(在集算器設計器中咱們能夠經過雙擊「區域訂單」值,來查看下一層明細數據):
第二步:從圖中能夠看到,"貨主國家" 和 "貨主地區" 字段就在第一層,所以在 B1 中直接調用A1.select(貨主國家 ==Country && Area.contain( 貨主地區)) 就能夠篩選出中國華北和華南的數據。
第三步:"區域訂單" 是咱們想要的明細數據,可是其中不包含 "貨主國家" 和 "貨主地區" 這兩個字段,所以咱們須要把這兩個字段和區域訂單的明細字段拼在一塊兒。這麼複雜的需求經過 news 函數就能夠一步到位解決。從 A2 格的表達式能夠看到參數並不複雜,把 B1. 貨主國家,B1. 貨主地區和 "區域訂單" 的所有字段拼在一塊兒就能夠了。看下執行結果:
第四步:在 B2 中經過=A2.select(year( 訂購日期)==Year)篩選出 "訂購日期" 的年份是 2013 年的數據。
最後讓咱們執行一下,能夠看到最終獲得的二維表徹底符合需求:
3. 明細數據不一樣結構的多層 JSON 數據文件
由於數據來源的複雜性,JSON 數據文件的明細數據有多是不一樣結構的,咱們一塊兒看一下這種 JSON 文件如何處理。下面是咱們要用到的 JSON 文件 sales.json:
第一層以年和月爲維度,第二層以國家爲維度,第三層是明細數據。可是明細數據中,因爲銷售渠道不一樣,結構是不徹底一致的,好比 "PRODUCTLINE"、"ADDRESSLINE1"、"ADDRESSLINE2" 在明細數據中並非必須的。如今,咱們要從數據中讀取 2017 和 2018 年北美兩個大國美國和加拿大的銷售數據。
爲了使用方便,咱們仍是先定義兩個參數:Year 和 Country:
接下來先看一下 SPL:
A |
B |
|
1 |
=json(file("sales.json").read()) |
=A1.select(Year.contain(YEAR)) |
2 |
=B1.news(MONTHLY_SALES;B1.YEAR:YEAR,B1.MONTH:MONTH,#1,#2) |
=A2.select(Country.contain(COUNTRY)) |
3 |
=B2.news(NATIONAL_MONTHLY_SALES;B2.YEAR:YEAR,B2.COUNTRY:COUNTRY,ORDERNUMBER,QUANTITYORDERED,PRICEEACH,ORDERLINENUMBER,SALES,ORDERDATE,STATUS,QTR_ID,PRODUCTLINE,MSRP,PRODUCTCODE,CUSTOMERNAME,PHONE,ADDRESSLINE1,ADDRESSLINE2,CITY,STATE,POSTALCODE,TERRITORY,CONTACTLASTNAME,CONTACTFIRSTNAME,DEALSIZE) |
下面來詳細解釋一下。
A1格仍是把 JSON 文件導入爲多層序表。
因爲年份字段就在第一層,B1 格中直接調用A1.select(Year.contain(YEAR))能夠從 A1 中篩選出 2017 和 2018 年份的數據:
接下來 A2 格中咱們再次用到了 news 函數,用來把年月字段和下一層的月銷售明細拼在一塊兒:
B2格中咱們經過A2.select(Country.contain(COUNTRY))從中篩選出來美國和加拿大的數據。
而後在 A3 格中,咱們再次用到了 news 函數,此次須要把 YEAR,MONTH,COUNTRY 和再下一層的國家月銷售明細拼在一個序表中。因爲這個文件中明細數據可能結構有所不一樣,咱們使用全量的字段名做爲參數來建立序表。字段的值會根據名稱設置,無此字段的會缺省爲空值(例以下圖 "ADDRESSLINE1" 和 "ADDRESSLINE2" 字段):
執行後能夠看到最終結果:
至此,一個多層結構的明細數據結構不徹底一致的 JSON 文件就成功展開成爲一個二維表了。
序表入庫
前面介紹了常見的 JSON 數據文件導入與解析,接下來是數據入庫的問題。之因此在最後才說入庫,並非由於複雜,偏偏相反的是,因爲前面的例子中最後生成的都是序表,所以更新數據庫就變得很是簡單方便。之前面導入 JSON 的例子 2 中的訂單表爲例:
A |
|
1 |
=file("orders.json").read().import@j().select(貨主國家 ==Country && 貨主地區 ==Area). 區域訂單.select(year( 訂購日期)==Year).derive(Country: 貨主國家,Area: 貨主地區) |
2 |
=connect("demo").update(A1, 訂單; 訂單 ID) |
能夠看到,更新數據庫只須要一句腳本!
這裏是比較常見的經過主鍵更新,用序表 A1 經過主鍵訂單 ID 來更新數據庫中的訂單表。SPL 中的 update 函數有不少選項,能夠知足更多的更新數據需求,這裏就再也不一一贅述了。
所以,只要用對了工具,從 JSON 文件導入解析到數據入庫,再繁瑣的任務也能夠輕鬆應對。除了 JSON 數據文件,集算器 SPL 還支持各類豐富多樣的數據來源,後續將經過更多的文章繼續分享給你們。
更多精彩內容,詳情請看原文閱讀