30

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

 5 years ago
source link: https://mp.weixin.qq.com/s/zdmo7UrwLkCoLI6FPEji4Q?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

uqayMbR.jpg!web

欢迎关注公众号 数据分析指北

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

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

历史回看:

- 基础(Data Access类型模块之一IO模块集合)

- 泰坦尼克沉船数据分析之二)

- 附录五 运行 KNIME workflow 时出现问题怎么办?

EZRv6nQ.jpg!web

Photo by Tobias Fischer on Unsplash

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

  • Data Access 类型模块(继续…)

    • Connector 部分

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

    • Read/Write部分

    • Manipulation 部分

    • Utility 部分

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

Data Access 类型模块(继续…)

Database 模块集合简述

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

A73Ani6.png!web

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 不默认支持的数据库如何访问。

mueeama.jpg!web

Database模块集合中的Connector部分

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

B3imMnR.jpg!web

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

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

UNFbuir.jpg!web

MySQL Connector的配置界面

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

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

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

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

2YVFVn6.jpg!web

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

其中 Database reader 的配置如下:

ABNV3eF.jpg!web

配置 Database reader

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

ziEniq3.jpg!web

group by 模块结果

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

eaQRNvu.jpg!web

第二种方法配置 Database reader

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

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

E3QrEj3.jpg!web

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

注意和上面的区别,其中的 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部分

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

UjeyQjY.png!web

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

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

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

2ARzIbe.jpg!web

Database Writer配置一瞥

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

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

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

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

Z7rAFfr.jpg!web

Parameterized Database Query的一个例子

Manipulation 部分

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

zaMBrq3.jpg!web

Database 模块集合中的 Manipulation 部分

[重点::sparkles::sparkles:;难度::sparkles::sparkles:]可以看到,模块和 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 语句的模块,相对来说用的较少。

RJvMBfv.png!web

Database 模块集合中的 Utility 部分

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

回头聊

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

6ZVNJju.jpg!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK