您好,登錄后才能下訂單哦!
JSON作為一種輕量級的數據交換格式,因其易于讀寫和交互的特點,已逐漸成為主流的數據類型之一。常見的編程語言大多都對 JSON 的讀取與解析提供了接口,但是接下來如何把多層 JSON 數據經過篩選、計算并展開成二維數據,就需要開發人員去頭疼了。本文就為大家分享一下如何利用集算器 SPL(結構化處理語言)輕松解決 JSON 數據解析入庫的問題。
JSON 數據文件導入與解析
根據 JSON 數據文件的復雜程度,以及不同的需求,我們會分三種情況來討論:
1. 單層的 JSON 數據文件
我們先從一個簡單的例子入手,看看普通鍵值映射的 JSON 文件如何讀取。下面是某產品訂單信息的 JSON 數據文件:
SPL導入 JSON 數據文件只需要簡單的一句腳本:
= json(file("product.json").read()) |
不需要寫循環函數,也不用解析 JSON 對象,執行一下就可以看到,JSON 數據文件已經轉換為二維數據序表了:
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 還支持各種豐富多樣的數據來源,后續將通過更多的文章繼續分享給大家。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。