數(shù)據(jù)分析指北 - KNIME 模塊( Data Access 類型模塊之三 JSON、XML、Web 與 MongoDB)

*歡迎關(guān)注公眾號 數(shù)據(jù)分析指北*

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

數(shù)據(jù)分析指北 - KNIME 模塊( Data Access 類型模塊之三 JSON、XML、Web 與 MongoDB)


歷史回看:

*Photo by NordWood Themes on Unsplash*

微信公眾號:數(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é)果:

*JSON Reader 配置界面*
*JSON Reader 的輸出結(jié)果*

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

*CSV Reader 的輸出結(jié)果*

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

*在 JSON Path 中提取了year*

在上面的配置中,我們只用了 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 等等。
我們配置完其他部分,運行并獲得輸出如下:

*JSON Path 的輸出結(jié)果*

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

*UnGroup 模塊的配置*
*UnGroup 模塊的結(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ù):

*XPath 配置*

JSON 與 XML 的相應(yīng)模塊

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

*JSON 相關(guān)節(jié)點*
*XML 相關(guān)節(jié)點*

其中,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)識,這一部分就相對比較簡單了,在此不在贅述。

*Web 相關(guān)節(jié)點*

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,然后才能安裝的。

*搜索安裝 MongoDB 相關(guān)擴展*
*MongoDB 相關(guān)節(jié)點*

回頭聊

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 32,284評論 2 89
  • 1、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明AI閱讀 16,186評論 3 119
  • 上大學(xué)以后,每次和別人介紹自己,說到我是江蘇人,就會被追問“蘇南還是蘇北呀”,這讓一向自稱是“蘇中”地區(qū)的我這南通...
    一隅之外閱讀 649評論 1 3
  • 5月18日 今天一位媽媽告訴我她最不能接受孩子的“丟三落四” 我無意間與她分享了我家爸爸如何“對付”丟三落四的我們...
    4ef8868fe3c0閱讀 421評論 0 0
  • 生活再累,記得一日三餐吃飽穿暖; 人情再冷,記得熱愛生活,敢于去愛; 夢想再遠,記得不忘初心,堅持到底; 每個人無...
    龍膽閱讀 218評論 0 0

友情鏈接更多精彩內(nèi)容