感覺有用致板?幫忙轉(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ī)則不會太難控嗜,如果想要更詳細的說明茧彤,請參照 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ā)浙垫?謝謝艺智!