天天看點

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

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

JSON 資料檔案導入與解析

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

  1. 單層的 JSON 資料檔案

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

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

SPL導入 JSON 資料檔案隻需要簡單的一句腳本:

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

不需要寫循環函數,也不用解析 JSON 對象,執行一下就可以看到,JSON 資料檔案已經轉換為二維資料序表了:

輕松應對多層JSON資料計算與入庫
  1. 明細資料相同結構的多層 JSON 資料檔案

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

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

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

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

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

我們先看一下 SPL 腳本:

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

下面來詳細解釋一下:

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

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

第二步:從圖中可以看到,"貨主國家" 和 "貨主地區" 字段就在第一層,是以在 B1 中直接調用A1.select(貨主國家 ==Country && Area.contain( 貨主地區)) 就可以篩選出中國華北和華南的資料。

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

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

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

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

輕松應對多層JSON資料計算與入庫
  1. 明細資料不同結構的多層 JSON 資料檔案

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

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

第一層以年和月為次元,第二層以國家為次元,第三層是明細資料。但是明細資料中,由于銷售管道不同,結構是不完全一緻的,比如 "PRODUCTLINE"、"ADDRESSLINE1"、"ADDRESSLINE2" 在明細資料中并不是必須的。現在,我們要從資料中讀取 2017 和 2018 年北美兩個大國美國和加拿大的銷售資料。

為了使用友善,我們還是先定義兩個參數:Year 和 Country:

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

接下來先看一下 SPL:

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

下面來詳細解釋一下。

A1格還是把 JSON 檔案導入為多層序表。

由于年份字段就在第一層,B1 格中直接調用A1.select(Year.contain(YEAR))可以從 A1 中篩選出 2017 和 2018 年份的資料:

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

接下來 A2 格中我們再次用到了 news 函數,用來把年月字段和下一層的月銷售明細拼在一起:

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

B2格中我們通過A2.select(Country.contain(COUNTRY))從中篩選出來美國和加拿大的資料。

然後在 A3 格中,我們再次用到了 news 函數,這次需要把 YEAR,MONTH,COUNTRY 和再下一層的國家月銷售明細拼在一個序表中。由于這個檔案中明細資料可能結構有所不同,我們使用全量的字段名作為參數來建立序表。字段的值會根據名稱設定,無此字段的會預設為空值(例如下圖 "ADDRESSLINE1" 和 "ADDRESSLINE2" 字段):

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

執行後可以看到最終結果:

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

至此,一個多層結構的明細資料結構不完全一緻的 JSON 檔案就成功展開成為一個二維表了。

**序表入庫

**

前面介紹了常見的 JSON 資料檔案導入與解析,接下來是資料入庫的問題。之是以在最後才說入庫,并不是因為複雜,恰恰相反的是,由于前面的例子中最後生成的都是序表,是以更新資料庫就變得非常簡單友善。以前面導入 JSON 的例子 2 中的訂單表為例:

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

可以看到,更新資料庫隻需要一句腳本!

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

   是以,隻要用對了工具,從 JSON 檔案導入解析到資料入庫,再繁瑣的任務也可以輕松應對。除了 JSON 資料檔案,集算器 SPL 還支援各種豐富多樣的資料來源,後續将通過更多的文章繼續分享給大家。

作者:WuNan

連結:

http://c.raqsoft.com.cn/article/1536633176729

來源:乾學院

著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。