感觉有用?帮忙转发?谢谢!
数据分析指北 - KNIME 模块( Data Access 类型模块之三 JSON、XML、Web 与 MongoDB)
历史回看:
微信公众号:数据分析指北
上一节我们讲了 KNIME 中 Data Access 类型模块中的一大类 -- Database 模块集合,并给出了对应于各模块的学习建议。这节我们讲 Data Access 类型模块中 JSON、XML 等模块集合。
Data Access 类型模块(继续...)
JSON、XML类型
JSON、XML是两种数据格式,在网络数据交换中,这两种数据格式的使用相对频繁,我们先看这两种数据格式。
JSON 格式介绍与解析
维基百科中是这么描述 JSON 的:JSON(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}
字样指的是这一列的数据存储的是 JSON 这种对象,而小写的 json
字样,代表了这一列的列名。这里对照回忆一下我们曾经在基础操作中讲过的班级信息的例子:
我们在班级信息中处理的是整数和字符串类型的数据,比如在 班
列名前面,有一个 I
的标识,就代表了这一列存储的是整型(Integer),而其他标识为 S
的,就代表那一列存储的是字符串(String)。数据在 KNIME 中存储的类型非常重要,可喜的是,KNIME 将这些信息以非常便于观察的方式展现,给我们下一步处理数据提供了很多线索。当我们猜不到某些标识的含义时,可以通过 Spec
标签页去了解具体的列存储的是什么类型的数据。
当我们通过 JSON Reader 把相应的 JSON 数据读取成 JSON 类型的数据后,我们需要把这种类型的数据转换为我们熟悉的整型、字符型、日期型以及浮点型等等才方便进行下一步的处理。在这里 JSON Path 这个模块就能够帮我们把 JSON 数据类型转换为其他数据类型。
打开 JSON Path 的配置页面,初看有点不知从何处下手,但其实非常好用,尤其是下面的 JSON-Cell Preview。如果我们想把 JSON 数据中的日期字段给摘出来,那么就直接点击 1999
,然后点击 Add Collection query
就可以了!现在我们可以点击刚刚生成的规则,看看下面 Preview 部分,是不是把你想要的结果都给标记出来了。在下图中,我们看到那两个被自动标记的蓝色日期就是我们想要提取的内容。
在上面的配置中,我们只用了 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 等等。
我们配置完其他部分,运行并获得输出如下:
对于 Collection
类型的 query,我们获得的一定是一个列表,这也就是图中图示 [...]
的含义,我们需要把这个列表拆开,一一对应起来。比如 1999,TimeLine,Michael...
这三个数据就应该是一行的。这个时候我们就需要用到 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,获取我们想要的数据:
JSON 与 XML 的相应模块
JSON 和 XML 的 KNIME 模块都是被组织在 Structured Data 节点下的。只要理解了上面的内容,大部分模块的功能基本上看个名字就能猜到什么意思了。
其中,JSON Path 与 XPath 按照之前的评分 -- [重点:✨✨✨;难度:✨✨]。
[重点:✨;难度:✨✨✨]Container Input(JSON)、Container Output(JSON) 这两个节点值得一提,功能相对比较高阶,会在 workflow 调用 workflow 的时候做为数据的接口用到。
[重点:✨;难度:✨ -- ✨✨]而其余的相关模块,就相对没有 JSON Path 和 XPath 那么重要了。
Web 相关
[重点:✨;难度:✨ -- ✨✨✨]有一些 Web 服务,通过调用它们(比如 Get Request)可以获得一些结果,这些结果如果是 JSON 或 XML 的,那么在后面的节点直接使用 JSON 和 XML 相关的处理模块进行数据的初步提取,继而进行后续的处理。只要我们搞清楚原始数据是怎么调用的,有没有登陆验证等过程,发送 Request 的时候需不需要加一些特定的标识,这一部分就相对比较简单了,在此不在赘述。
NoSQL 相关(以 MongoDB 为例)
[重点:✨;难度:✨] 如果我们搞懂了 JSON,其实我们也顺便搞懂了 NoSQL 数据库中的 MongoDB 是怎么读取的。因为 MongoDB 默认的输出就是 JSON!MongoDB 不属于 KNIME Database 中的节点,现在它属于 KNIME Labs 中的节点,默认我们是需要打开菜单 File -> Install KNIME Extensions, 并在搜索对话框中搜索 KNIME MongoDB Integration,然后才能安装的。
回头聊
感觉有用?帮忙转发?谢谢!