輕鬆應對多層JSON資料計算與入庫

2021-09-20 02:23:48 字數 3370 閱讀 7950

json作為一種輕量級的資料交換格式,因其易於讀寫和互動的特點,已逐漸成為主流的資料型別之一。常見的程式語言大多都對 json 的讀取與解析提供了介面,但是接下來如何把多層 json 資料經過篩選、計算並展開成二維資料,就需要開發人員去頭疼了。本文就為大家分享一下如何利用集算器 spl(結構化處理語言)輕鬆解決 json 資料解析入庫的問題。

json 資料檔案匯入與解析

根據 json 資料檔案的複雜程度,以及不同的需求,我們會分三種情況來討論:

單層的 json 資料檔案

我們先從乙個簡單的例子入手,看看普通鍵值對映的 json 檔案如何讀取。下面是某產品訂單資訊的 json 資料檔案:

spl匯入 json 資料檔案只需要簡單的一句指令碼:

不需要寫迴圈函式,也不用解析 json 物件,執行一下就可以看到,json 資料檔案已經轉換為二維資料序表了:

明細資料相同結構的多層 json 資料檔案

接下來,我們看一下多層的 json 檔案如何處理。下面是我們要用到的 json 資料檔案 orders.json:

可以看到,json 資料分為兩層,第一層是 "貨主國家" 和 "貨主地區",第二層是明細資料。現在我們想要從中匯入中國華北和華南地區 2013 年的訂單,讓我們看看如果用 spl 實現。

這次我們先來定義一下引數:country、area 和 year,分別對應需要匯入的貨主國家、貨主地區和訂購日期的年份。通過定義引數,以後匯入不同國家、地區和年份的時候,就不再需要修改 spl,只需要提供相應的引數值就行了。這裡需要注意的是,area 的值是序列,預設值是 [華北, 華南],這樣就可以同時讀取多個地區的資料。如下圖:

我們先看一下 spl 指令碼:

下面來詳細解釋一下:

第一步:a1 中 =json(file("orders.json").read()),匯入 json 檔案生成序表。執行一下,可以看到 json 資料按層級被展現出來(在集算器設計器中我們可以通過雙擊「區域訂單」值,來檢視下一層明細資料):

第二步:從圖中可以看到,"貨主國家" 和 "貨主地區" 欄位就在第一層,因此在 b1 中直接呼叫a1.select(貨主國家 ==country && area.contain( 貨主地區)) 就可以篩選出中國華北和華南的資料。

第三步:"區域訂單" 是我們想要的明細資料,但是其中不包含 "貨主國家" 和 "貨主地區" 這兩個字段,因此我們需要把這兩個欄位和區域訂單的明細字段拼在一起。這麼複雜的需求通過 news 函式就可以一步到位解決。從 a2 格的表示式可以看到引數並不複雜,把 b1. 貨主國家,b1. 貨主地區和 "區域訂單" 的全部字段拼在一起就可以了。看下執行結果:

第四步:在 b2 中通過=a2.select(year( 訂購日期)==year)篩選出 "訂購日期" 的年份是 2013 年的資料。

最後讓我們執行一下,可以看到最終得到的二維表完全符合需求:

明細資料不同結構的多層 json 資料檔案

因為資料**的複雜性,json 資料檔案的明細資料有可能是不同結構的,我們一起看一下這種 json 檔案如何處理。下面是我們要用到的 json 檔案 sales.json:

第一層以年和月為維度,第二層以國家為維度,第三層是明細資料。但是明細資料中,由於銷售渠道不同,結構是不完全一致的,比如 "productline"、"addressline1"、"addressline2" 在明細資料中並不是必須的。現在,我們要從資料中讀取 2017 和 2018 年北美兩個大國美國和加拿大的銷售資料。

為了使用方便,我們還是先定義兩個引數:year 和 country:

接下來先看一下 spl:

下面來詳細解釋一下。

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 中的訂單表為例:

可以看到,更新資料庫只需要一句指令碼!

這裡是比較常見的通過主鍵更新,用序表 a1 通過主鍵訂單 id 來更新資料庫中的訂單表。spl 中的 update 函式有很多選項,可以滿足更多的更新資料需求,這裡就不再一一贅述了。

因此,只要用對了工具,從 json 檔案匯入解析到資料入庫,再繁瑣的任務也可以輕鬆應對。除了 json 資料檔案,集算器 spl 還支援各種豐富多樣的資料**,後續將通過更多的文章繼續分享給大家。

輕鬆應對多層JSON資料計算與入庫

json作為一種輕量級的資料交換格式,因其易於讀寫和互動的特點,已逐漸成為主流的資料型別之一。常見的程式語言大多都對 json 的讀取與解析提供了介面,但是接下來如何把多層 json 資料經過篩選 計算並展開成二維資料,就需要開發人員去頭疼了。本文就為大家分享一下如何利用集算器 spl 結構化處理語...

JSON多層資料新增與訪問

最近專案中有要用到,json的多層資料物件,相當是乙個json格式陣列裡面巢狀乙個json物件吧,至於我為什麼要用到這個呢,引入業務場景 兩組資料 1 user id user hs user name 2 user id user location 這兩組資料分別從伺服器獲取 但後期有又必須匹配進...

JSONObject 解析多層json資料

多層巢狀時,只需要解析多層巢狀次數 1,解析完成後可直接取出資料。相同資料需要使用for迴圈。jsonarray是陣列,jsonobject是單條資料。jsonobject jsonobject new jsonobject responsetext jsonobject jsonobject1 j...