数据分析指北 - KNIME 模块( Data Access 类型模块之二 Database 模块集合)

数据分析指北 - KNIME 模块( Data Access 类型模块之二 Database 模块集合)_第1张图片
*欢迎关注公众号 数据分析指北*

感觉有用?帮忙转发?谢谢!

数据分析指北 - KNIME 模块( Data Access 类型模块之二 Database 模块集合)


历史回看:

  • 基础(Data Access类型模块之一IO模块集合)
  • 泰坦尼克沉船数据分析之二)
  • 附录五 运行 KNIME workflow 时出现问题怎么办?

数据分析指北 - KNIME 模块( Data Access 类型模块之二 Database 模块集合)_第2张图片
*Photo by Tobias Fischer on Unsplash*

Photo by Tobias Fischer on Unsplash

微信公众号:数据分析指北

  • Data Access 类型模块(继续...)
    • Database 模块集合简述
      • Connector 部分
      • KNIME 从数据库获取数据的两种模式
      • Read/Write部分
      • Manipulation 部分
      • Utility 部分

上一节我们讲了 KNIME 中 Data Access 类型模块中的一大类--IO模块集合,并给出了对应于各模块的学习建议。这节我们讲 DATA Access 类型模块中的 Database 模块集合。

Data Access 类型模块(继续...)

Database 模块集合简述

注:以下 Database 模块均是 KNIME 3.6.2 中的模块,KNIME 官方正在开发新一套的数据库相关模块,支持流相关操作,可能会在不久后释出,名称类似 DB xxxx,请注意区别。

数据分析指北 - KNIME 模块( Data Access 类型模块之二 Database 模块集合)_第3张图片
*Node Repository中的Database模块集合*

Node Repository中的Database模块集合

Database类型的模块主要分为 Read/Write、Connector、Manipulation 和 Utility 四个部分。按照逻辑来讲,如果我们只谈纯粹Data Access类型的模块,似乎讲其中的 Read 部分就够了,但实际上,因为 Database 模块的非独立性(即它不像上面所说的文件读写模块类型,单独就可以运行),除了 Write 部分以外,其余部分可以均成为"Data Access"这个类型的组成成分,所以也将其归类在这里。我们先从 Connector 部分开始讲起。

Connector 部分

在基础(基础数据操作之二,读取数据源)一篇中,我们描述了 KNIME 是如何通过 JDBC 驱动去连接各种各样类型的数据库。对于一些基本的关系型数据库,SQLite、MySQL、MSSQL、PostgresSQL等,KNIME 已经内置了相应的 JDBC 驱动,我们需要做的只是选择特定的connector,然后配置数据库地址、端口、用户名以及密码之类的信息就可以连接了。对于 KNIME 中没有内置驱动的数据库,我们需要做的是先在相应数据库的官网或社区下载到对应的 JDBC 驱动,并在 KNIME 中配置,最后使用 Database Connector 这个通用模块连接数据库。可参照附录四 如何配置 KNIME 访问 MS Access 中关于 MS Access DB 的连接学习 KNIME 不默认支持的数据库如何访问。

数据分析指北 - KNIME 模块( Data Access 类型模块之二 Database 模块集合)_第4张图片
*Database模块集合中的Connector部分*

Database模块集合中的Connector部分

[重点:✨✨✨;难度:✨]Database Connector模块。这是一个通用型的模块,在使用时,需要指定相应的 JDBC 驱动,并且配置相应数据库的URL以及其他相关信息。在其他 KNIME 数据库 connector 模块不能满足你要求的情况下,它将是你的唯一选择。甚至在这个模块当中,你也可以配置其驱动,使其变成一个MySQL Connector。如下图所示,在Database driver选择了 MySQL 的驱动,然后在 URL 位置按照格式写下MySQL的连接地址和端口就可以了。如果你的数据中有时间相关的字段,那么在整个配置中,TimeZone 需要特别注意一下。

数据分析指北 - KNIME 模块( Data Access 类型模块之二 Database 模块集合)_第5张图片
*经过特定配置后可以读取 MySQL 的 Database Connector*

经过特定配置后可以读取 MySQL 的 Database Connector

[重点:✨✨;难度:✨]MySQL Connector 模块。这里不用像上面的模块根据格式列写数据库 URL,而只需要按照格式填写数据库相应配置内容就可以了。其实内部的组成和上面的 Database Connector 组成一致。对于学过计算机语言的人来说,这其实就是面对对象编程(OOP)中的概念,Database Connector 对应了基类,而 MySQL Connector 只是在基类上做了继承的子类。这个模块的输出和上面 Database Connector 的输出都是a database JDBC connnection,可以理解为类的一个实例。对于没有系统学过OOP的人,只需要把输出理解为数据库的连接就可以了。此模块输出端口在图形上显示的是一个红色的实心框框。

数据分析指北 - KNIME 模块( Data Access 类型模块之二 Database 模块集合)_第6张图片
*MySQL Connector的配置界面*

MySQL Connector的配置界面

而其余的 Connector 和 MySQL Connector 一样,都是继承自 Database Connector,不再赘述。

KNIME 从数据库获取数据的两种模式

[重点:✨✨✨;难度:✨✨]在继续讲模块之前,先介绍一下(Big Picture)数据库读取的两种模式:一种是将数据从数据库中取出后,利用 KNIME 的模块进行分析;另外一种方式是,在数据库中就做一些预处理,然后再把接下来的数据放在 KNIME 中处理。

比如我们有一个叫做 titanic 的 sqlite 数据库(具体数据内容请参照泰坦尼克沉船数据分析之一) 中的介绍)。我们现在想了解一下整个数据中男性和女性的数量是多少,按照上面介绍的第一种方法,我们做出如下的 workflow:

数据分析指北 - KNIME 模块( Data Access 类型模块之二 Database 模块集合)_第7张图片
*将数据从数据库中读出再做处理*

将数据从数据库中读出再做处理

其中 Database reader 的配置如下:

数据分析指北 - KNIME 模块( Data Access 类型模块之二 Database 模块集合)_第8张图片
*配置 Database reader*

配置 Database reader

group by 模块配置很简单,不做赘述,最后得到如下结果:

数据分析指北 - KNIME 模块( Data Access 类型模块之二 Database 模块集合)_第9张图片
*group by 模块结果*

group by 模块结果

如果按照上面所说的第二种方法,那么我们删除 Group by 模块,重新配置 database reader 模块:

数据分析指北 - KNIME 模块( Data Access 类型模块之二 Database 模块集合)_第10张图片
*第二种方法配置 Database reader*

第二种方法配置 Database reader

第一种方法是将计算的过程放在了 KNIME 中,而第二种方法是把计算的过程放在了数据库中(这种方式称为 in-database processing )。这两种方法究竟哪一种合适,需要根据具体情况具体分析,有时你的数据库硬件配置比较强,那么放在数据库中计算能够显著加快你构建模型、调试的速度;有时你的 SQL 语句太复杂,那么也许将计算的过程放在 KNIME 中是比较适合。需要你根据具体情况 trade off。

另外,在KNIME中,第二种方法有另外一种写法,就是利用 KNIME database 相关的 Manipulation 模块,比如对于前面的问题来说,可以这样构建 workflow:

数据分析指北 - KNIME 模块( Data Access 类型模块之二 Database 模块集合)_第11张图片
*第二种方法的另外一种形式*

第二种方法的另外一种形式

注意和上面的区别,其中的 database table selector 模块,只是读取了 titanic 数据(这个过程是发生在数据库层面的),然后在数据库层面做了 group by 的操作( Database GroupBy 和 KNIME中的 GroupBy 大同小异),最后利用 Database Connection Table Reader 模块(注意,这不是上面的 Database Reader模块)将数据从数据库中读取到 KNIME 中。

Database Manipulation 模块其实只是把第二种方法复杂的 SQL 语句变成了图形化的方案,你可以通过观察 Database GroupBy 的输出对这种方法的原始实现有一个认识。Database GroupBy 节点的输出:

Database Driver:  
org.sqlite.JDBC  

Database URL: 
jdbc:sqlite:/Users/HaveF/Desktop/knime-workspace/practicalDA/07DatabaseExample1/db.sqlite  

User Name:    

Database Type:  
sqlite  

SQL Statement: 
SELECT Sex, COUNT(table_1189361459.Survived) AS Survived FROM (SELECT * FROM titanic) table_1189361459 GROUP BY Sex

可以通过上面的 SQL Statement 看出,这里和第二种方法类似,构建了 SQL 语句,但这种方法最大的好处在于,方便调试复杂的 SQL 语句,具体可以参照 database 相关节点输出中的table preview来理解,在此不做细讲。

如果想实验整个过程,可以利用我已经构建好的 workflow 做实验。
关注公众号:数据分析指北,回复"作业",即可获得下载链接。

Read/Write部分

如果已经搞明白上面两种获取数据库数据的方法,那么下面的内容就相对来说很简单了。我们快速浏览一下:

数据分析指北 - KNIME 模块( Data Access 类型模块之二 Database 模块集合)_第12张图片
*Database模块集合中的Read/Write部分*

Database模块集合中的Read/Write部分

[重点:✨✨✨;难度:✨]Database Reader 在上面已经使用过,配置项很少,只需要把sql语句填进去就可以了。

[重点:✨✨✨;难度:✨]Database Writer 只需要填好需要写的表名,并配置好数据的 SQL type 。

数据分析指北 - KNIME 模块( Data Access 类型模块之二 Database 模块集合)_第13张图片
*Database Writer配置一瞥*

Database Writer配置一瞥

[重点:✨✨;难度:✨✨]Database Table Selector 在上面也已经使用过,这是一个 in-database processing 的模块,这个模块的输出其实是一个sql语句,后面只能接其他 in-database processing 的模块,这些类型的模块的终点只能是database connection table reader 或 database connection table writer,通过这两个节点,要么把在数据库中内部处理的数据输出到 KNIME 中,要么把处理的结果再重新写回到数据库中。

[重点:✨;难度:✨✨]Database Table Connector其实是 Database connector 和 Database Table Selector两个模块组合的一个快捷方式。

[重点:✨✨✨;难度:✨✨]Database Update、Delete 模块都是类似Writer的标准模块。需要注意的是,Update 模块不能够插入数据库中没有的条目,它只是一个更新(update)模块。如果你有一些数据想更新到数据库中,那么你需要先把这部分数据根据条件(比如主键)分成数据库中有的数据和数据库中没有的数据,将数据库中有的数据通过 Update 更新,而将数据库中没有的数据通过 Writer 模块写入。在将来的KNIME数据库模块中,会有名为DB merge的模块,一个节点统一处理上述情况。

[重点:✨;难度:✨✨✨]Database Looping 和 Parameterized Database Query 主要就是一些参数化的查询。比如 可以通过 Looping 模块来查询一系列类似条件的数据。而后一个模块在查询时可以加入一些动态参数,比如下面的例子中,就是将动态数据(例子中是以 web 服务获取到JSON数据做为临时数据)放在查询语句中,查询出结果并返回。

数据分析指北 - KNIME 模块( Data Access 类型模块之二 Database 模块集合)_第14张图片
*Parameterized Database Query的一个例子*

Parameterized Database Query的一个例子

Manipulation 部分

Manipulation部分的模块,主要是配合上面说的 in-database processing 的过程,如下所示:

数据分析指北 - KNIME 模块( Data Access 类型模块之二 Database 模块集合)_第15张图片
*Database 模块集合中的 Manipulation 部分*

Database 模块集合中的 Manipulation 部分

[重点:✨✨;难度:✨✨]可以看到,模块和 KNIME column/ row 相关的 Manipulation 类似,只不过这些操作是在数据库中进行的。这样也带来了另外一个问题 -- 这些模块有一些功能其实比较依赖于数据库本身,就拿 Group By 模块来说,KNIME 自身的 Group By 模块有很多的 Group Functions 或 Aggregate Functions 聚合函数(参照基础( 基础数据操作之四,从SQL的case,group by,join 到工具KNIME )),但这些 Functions 在 Database GroupBy 中就只有少部分能支持了。

对于数据库操作能力比较强的小伙伴来说,也许感觉 Manipulation 部分比较鸡肋,但根据个人经验来说,如果你写的 SQL 百行以上时,Debug 就相对来说比较困难了,这种时候,也许这些模块能够帮你忙。

Utility 部分

Utility 部分内容比较少,Drop Table 含义一望即知;SQL executor 是 in-database processing 中的一个可以自定义sql语句的模块;而 SQL inject、Extract 是在 in-database processing 中操作中间生成 SQL 语句的模块,相对来说用的较少。

*Database 模块集合中的 Utility 部分*

Database 模块集合中的 Utility 部分

至此,基础的关系型数据库相关的 Data Access 类型模块就介绍完毕了。

回头聊

感觉有用?帮忙转发?谢谢!

数据分析指北 - KNIME 模块( Data Access 类型模块之二 Database 模块集合)_第16张图片

[图片上传失败...(image-b26e0c-1543206638369)]

你可能感兴趣的:(数据分析指北 - KNIME 模块( Data Access 类型模块之二 Database 模块集合))