
感覺有用?幫忙轉(zhuǎn)發(fā)?謝謝!
數(shù)據(jù)分析指北 - KNIME 模塊( Data Access 類型模塊之三 JSON、XML、Web 與 MongoDB)
歷史回看:

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


注意到輸出結(jié)果紅色框所標(biāo)記的內(nèi)容,{JSON} 字樣指的是這一列的數(shù)據(jù)存儲的是 JSON 這種對象,而小寫的 json 字樣,代表了這一列的列名。這里對照回憶一下我們曾經(jīng)在基礎(chǔ)操作中講過的班級信息的例子:

我們在班級信息中處理的是整數(shù)和字符串類型的數(shù)據(jù),比如在 班 列名前面,有一個 I 的標(biāo)識,就代表了這一列存儲的是整型(Integer),而其他標(biāo)識為 S 的,就代表那一列存儲的是字符串(String)。數(shù)據(jù)在 KNIME 中存儲的類型非常重要,可喜的是,KNIME 將這些信息以非常便于觀察的方式展現(xiàn),給我們下一步處理數(shù)據(jù)提供了很多線索。當(dāng)我們猜不到某些標(biāo)識的含義時,可以通過 Spec 標(biāo)簽頁去了解具體的列存儲的是什么類型的數(shù)據(jù)。
當(dāng)我們通過 JSON Reader 把相應(yīng)的 JSON 數(shù)據(jù)讀取成 JSON 類型的數(shù)據(jù)后,我們需要把這種類型的數(shù)據(jù)轉(zhuǎn)換為我們熟悉的整型、字符型、日期型以及浮點型等等才方便進行下一步的處理。在這里 JSON Path 這個模塊就能夠幫我們把 JSON 數(shù)據(jù)類型轉(zhuǎn)換為其他數(shù)據(jù)類型。

打開 JSON Path 的配置頁面,初看有點不知從何處下手,但其實非常好用,尤其是下面的 JSON-Cell Preview。如果我們想把 JSON 數(shù)據(jù)中的日期字段給摘出來,那么就直接點擊 1999,然后點擊 Add Collection query 就可以了!現(xiàn)在我們可以點擊剛剛生成的規(guī)則,看看下面 Preview 部分,是不是把你想要的結(jié)果都給標(biāo)記出來了。在下圖中,我們看到那兩個被自動標(biāo)記的藍色日期就是我們想要提取的內(nèi)容。

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

對于 Collection 類型的 query,我們獲得的一定是一個列表,這也就是圖中圖示 [...] 的含義,我們需要把這個列表拆開,一一對應(yīng)起來。比如 1999,TimeLine,Michael... 這三個數(shù)據(jù)就應(yīng)該是一行的。這個時候我們就需要用到 UnGroup 模塊了。UnGroup 模塊比較簡單,主要是用來拆開列表數(shù)據(jù)的,配置和結(jié)果如下:


可以看到,輸出結(jié)果和我們期待的基本一致,只需要把對應(yīng)的 JSON 列去除就可以了。如果想要做這部分實驗的同學(xué),請關(guān)注公眾號"數(shù)據(jù)分析指北",回復(fù)"作業(yè)",獲取下載鏈接。
XML 格式介紹與解析
XML 是一種比 JSON 更為古老的格式,全名為 Extensible Markup Language (可擴展標(biāo)記語言),它是一種標(biāo)記語言。如下是一段具體的 XML 數(shù)據(jù):
<?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 數(shù)據(jù)并沒有本質(zhì)上的不同,只不過是約定了不同的數(shù)據(jù)存儲和展示格式。下面我們配置一個類似于 JSON Path 的模塊 -- XPath,獲取我們想要的數(shù)據(jù):

JSON 與 XML 的相應(yīng)模塊
JSON 和 XML 的 KNIME 模塊都是被組織在 Structured Data 節(jié)點下的。只要理解了上面的內(nèi)容,大部分模塊的功能基本上看個名字就能猜到什么意思了。


其中,JSON Path 與 XPath 按照之前的評分 -- [重點:???;難度:??]。
[重點:?;難度:???]Container Input(JSON)、Container Output(JSON) 這兩個節(jié)點值得一提,功能相對比較高階,會在 workflow 調(diào)用 workflow 的時候做為數(shù)據(jù)的接口用到。
[重點:?;難度:? -- ??]而其余的相關(guān)模塊,就相對沒有 JSON Path 和 XPath 那么重要了。
Web 相關(guān)
[重點:?;難度:? -- ???]有一些 Web 服務(wù),通過調(diào)用它們(比如 Get Request)可以獲得一些結(jié)果,這些結(jié)果如果是 JSON 或 XML 的,那么在后面的節(jié)點直接使用 JSON 和 XML 相關(guān)的處理模塊進行數(shù)據(jù)的初步提取,繼而進行后續(xù)的處理。只要我們搞清楚原始數(shù)據(jù)是怎么調(diào)用的,有沒有登陸驗證等過程,發(fā)送 Request 的時候需不需要加一些特定的標(biāo)識,這一部分就相對比較簡單了,在此不在贅述。

NoSQL 相關(guān)(以 MongoDB 為例)
[重點:?;難度:?] 如果我們搞懂了 JSON,其實我們也順便搞懂了 NoSQL 數(shù)據(jù)庫中的 MongoDB 是怎么讀取的。因為 MongoDB 默認(rèn)的輸出就是 JSON!MongoDB 不屬于 KNIME Database 中的節(jié)點,現(xiàn)在它屬于 KNIME Labs 中的節(jié)點,默認(rèn)我們是需要打開菜單 File -> Install KNIME Extensions, 并在搜索對話框中搜索 KNIME MongoDB Integration,然后才能安裝的。


回頭聊
感覺有用?幫忙轉(zhuǎn)發(fā)?謝謝!