資料分析指北 - KNIME 模組( Data Access 型別模組之三 JSON、XML、Web 與 MongoDB)

*歡迎關注公眾號 資料分析指北*
感覺有用?幫忙轉發?謝謝!
資料分析指北 - KNIME 模組( Data Access 型別模組之三 JSON、XML、Web 與 MongoDB)
歷史回看:
- ofollow,noindex">模組基礎
- 基礎(Data Access型別模組之一IO模組集合)
- 基礎(Data Access 型別模組之二 Database 模組集合)

*Photo by NordWood Themes on Unsplash*
微信公眾號:資料分析指北
- Data Access 型別模組(繼續...)
上一節我們講了 KNIME 中 Data Access 型別模組中的一大類 -- Database 模組集合,並給出了對應於各模組的學習建議。這節我們講 Data Access 型別模組中 JSON、XML 等模組集合。
Data Access 型別模組(繼續...)
JSON、XML型別
JSON、XML是兩種資料格式,在網路資料交換中,這兩種資料格式的使用相對頻繁,我們先看這兩種資料格式。
JSON 格式介紹與解析
維基百科中是這麼描述 JSON 的:JSON(JavaScript/">JavaScript Object Notation,JavaScript物件表示法)是一種由道格拉斯·克羅克福特構想和設計、輕量級的資料交換語言,該語言以易於讓人閱讀的文字為基礎,用來傳輸由屬性值或者序列性的值組成的資料物件。
儘管 JSON 是 JavaScript 的一個子集,但其實它是一種獨立於語言的文字格式,只不過因為它脫胎與 JavaScript,所以 JSON 這個名字就這麼延續稱呼起來了。這裡不去介紹具體 JSON 的組成、形式等,而舉一個 JSON 例子,目的是讓我們瞭解 JSON 就是大概如此模樣,如何才能交給我們其他的 KNIME 模組進行下一步的處理。如下是一段具體的 JSON 資料:
{ "book": [ { "year": 1999, "title": "Timeline", "author": "Michael Crichton" }, { "year": 2000, "title": "Plain Truth", "author": "Jodi Picoult" } ] }
不用瞭解 JSON 的具體規則,我們也大致清楚上面在說什麼。有兩本書,我們錄有它們的年份、書名以及作者,每一個 {...}
中對應了一條資訊,如果套用曾經我們用過的 CSV 檔案( 基礎(基礎資料操作之二,讀取資料來源) ),那麼以上的資料可能要表示成類似下面這樣才能繼續分析:
year,title,author 1999,"Timeline","Michael Crichton" 2000,"Plain Truth","Jodi Picoult"
那麼,怎麼樣把 JSON 格式中的各個欄位對應到 CSV 類似欄位呢?我們需要做的就是告訴計算機,去 JSON 的什麼位置取什麼資料,然後把它們組合在一起就可以了。
而具體的 "去什麼位置" 就是靠指定 "具體資料所在的位置" 來實現的。
在 KNIME 中,對於 JSON 和 XML 都有相應的 Reader 模組(在 KNIME Node Repository 的 Structured Data 集合中),我們需要做的主要是配置 "具體資料所在的位置"。下圖就是 JSON Reader 模組的配置介面以及輸出結果:

*JSON Reader 配置介面*

*JSON Reader 的輸出結果*
注意到輸出結果紅色框所標記的內容, {JSON}
字樣指的是這一列的資料儲存的是 JSON 這種物件,而小寫的 json
字樣,代表了這一列的列名。這裡對照回憶一下我們曾經在基礎操作中講過的班級資訊的例子:

*CSV Reader 的輸出結果*
我們在班級資訊中處理的是整數和字串型別的資料,比如在 班
列名前面,有一個 I
的標識,就代表了這一列儲存的是整型(Integer),而其他標識為 S
的,就代表那一列儲存的是字串(String)。資料在 KNIME 中儲存的型別非常重要,可喜的是,KNIME 將這些資訊以非常便於觀察的方式展現,給我們下一步處理資料提供了很多線索。當我們猜不到某些標識的含義時,可以通過 Spec
標籤頁去了解具體的列儲存的是什麼型別的資料。
當我們通過 JSON Reader 把相應的 JSON 資料讀取成 JSON 型別的資料後,我們需要把這種型別的資料轉換為我們熟悉的整型、字元型、日期型以及浮點型等等才方便進行下一步的處理。在這裡 JSON Path 這個模組就能夠幫我們把 JSON 資料型別轉換為其他資料型別。

*JSON Path 的配置頁面*
開啟 JSON Path 的配置頁面,初看有點不知從何處下手,但其實非常好用,尤其是下面的 JSON-Cell Preview。如果我們想把 JSON 資料中的日期欄位給摘出來,那麼就直接點選 1999
,然後點選 Add Collection query
就可以了!現在我們可以點選剛剛生成的規則,看看下面 Preview 部分,是不是把你想要的結果都給標記出來了。在下圖中,我們看到那兩個被自動標記的藍色日期就是我們想要提取的內容。

*在 JSON Path 中提取了year*
在上面的配置中,我們只用了 Add Collection Query
這一個功能,就會自動生成對應的 Column name、JSON Path 等資訊;如果我們不是想要所有的日期,而只是想提取 1999 這一個年份,那麼我們可以用 Add Single Query
這個功能;如果我們想要自己手動寫 JSON Path 也是很容易的,看看前面自動生成的 JSON Path -- $['book'][*]['year']
,想要寫一個類似的路徑規則不會太難,如果想要更詳細的說明,請參照 JSON Path 自帶的幫助檔案。另外其中有意思的一點是,如果使用的是 Collection Query,對應的 Column name 是一個複數單詞。比如 year 會被提取為 years、title 會被提取為 titles 等等。
我們配置完其他部分,執行並獲得輸出如下:

*JSON Path 的輸出結果*
對於 Collection
型別的 query,我們獲得的一定是一個列表,這也就是圖中圖示 [...]
的含義,我們需要把這個列表拆開,一一對應起來。比如 1999,TimeLine,Michael...
這三個資料就應該是一行的。這個時候我們就需要用到 UnGroup 模組了。UnGroup 模組比較簡單,主要是用來拆開列表資料的,配置和結果如下:

*UnGroup 模組的配置*

*UnGroup 模組的結果*
可以看到,輸出結果和我們期待的基本一致,只需要把對應的 JSON 列去除就可以了。如果想要做這部分實驗的同學,請關注公眾號"資料分析指北",回覆"作業",獲取下載連結。
XML 格式介紹與解析
XML 是一種比 JSON 更為古老的格式,全名為 Extensible Markup Language (可擴充套件標記語言),它是一種標記語言。如下是一段具體的 XML 資料:
<?xml version="1.0" encoding="UTF-8"?> <inventory> <book year="1999"> <title>Harry Potter and the Sorcerer's Stone</title> <author>J. K. Rowling</author> </book> <book year="2000"> <title>Harry Potter and the Chamber of Secrets</title> <author>J. K. Rowling</author> </book> </inventory>
可以看到,其實它和 JSON 資料並沒有本質上的不同,只不過是約定了不同的資料儲存和展示格式。下面我們配置一個類似於 JSON Path 的模組 -- XPath,獲取我們想要的資料:

*XPath 配置*
JSON 與 XML 的相應模組
JSON 和 XML 的 KNIME 模組都是被組織在 Structured Data 節點下的。只要理解了上面的內容,大部分模組的功能基本上看個名字就能猜到什麼意思了。

*JSON 相關節點*

*XML 相關節點*
其中,JSON Path 與 XPath 按照之前的評分 -- [重點::sparkles::sparkles::sparkles:;難度::sparkles::sparkles:]。
[重點::sparkles:;難度::sparkles::sparkles::sparkles:]Container Input(JSON)、Container Output(JSON) 這兩個節點值得一提,功能相對比較高階,會在 workflow 呼叫 workflow 的時候做為資料的介面用到。
[重點::sparkles:;難度::sparkles: -- :sparkles::sparkles:]而其餘的相關模組,就相對沒有 JSON Path 和 XPath 那麼重要了。
Web 相關
[重點::sparkles:;難度::sparkles: -- :sparkles::sparkles::sparkles:]有一些 Web 服務,通過呼叫它們(比如 Get Request)可以獲得一些結果,這些結果如果是 JSON 或 XML 的,那麼在後面的節點直接使用 JSON 和 XML 相關的處理模組進行資料的初步提取,繼而進行後續的處理。只要我們搞清楚原始資料是怎麼呼叫的,有沒有登陸驗證等過程,傳送 Request 的時候需不需要加一些特定的標識,這一部分就相對比較簡單了,在此不在贅述。

*Web 相關節點*
NoSQL 相關(以 MongoDB 為例)
[重點::sparkles:;難度::sparkles:] 如果我們搞懂了 JSON,其實我們也順便搞懂了 NoSQL 資料庫中的 MongoDB 是怎麼讀取的。因為 MongoDB 預設的輸出就是 JSON!MongoDB 不屬於 KNIME Database 中的節點,現在它屬於 KNIME Labs 中的節點,預設我們是需要開啟選單 File -> Install KNIME Extensions, 並在搜尋對話方塊中搜索 KNIME MongoDB Integration,然後才能安裝的。

*搜尋安裝 MongoDB 相關擴充套件*

*MongoDB 相關節點*
回頭聊
感覺有用?幫忙轉發?謝謝!
