Kettle (2) - 抽取数据库表的数据

数据库表是 ETL 数据抽取最常见的的数据源。我们以 MySQL 为例,了解 Kettle 从数据库中抽取数据的要点。

连接数据库,最重要的是数据库驱动。对传统数据库,Kettle 同时支持 JDBC 和 ODBC,但如果 Java 版本 为 Java 8 以上,使用 OBDC 会有问题,因为 Java 8 中 JDBC-ODBC Bridge 已经被移除,所以可能的话,尽量避免 ODBC。

连接数据库

Kettle PDI 7.1 并没有提供 jdbc-MySQL 的数据库驱动,需要自行下载,然后将驱动 (比如我下载的版本 mysql-connector-java-5.1.44-bin.jar)放在 pdi 安装目录\data-integration\lib 目录下。

启动 Spoon,新建一个转换,切换到导航区的 “主对象树”,选中 “DB连接”,鼠标右键,选择“新建数据库连接向导”。

  • 数据库连接名称:localmysql
  • 数据库连接类型:MySQL
  • 数据库访问类型: Native (JDBC)

Kettle (2) - 抽取数据库表的数据_第1张图片

点击 “Next” 按钮,连接到本地数据库,服务器主机名:localhost,“数据库” 输入 sakila,这是 MySQL 提供的示例数据库,可以在官网下载并且导入。

Kettle (2) - 抽取数据库表的数据_第2张图片

点击 “Next” 按钮,输入用户名和密码,测试连接,如果连接成功,点击 “确定” 按钮,完成到数据库的连接。

从数据库表抽取数据

从数据库表抽取数据,需要用到 “表输入” 控件。从 “输入” 文件夹下,选择 “表输入” 组件,拖放到右边的工作区。双击:

Kettle (2) - 抽取数据库表的数据_第3张图片

我们看到,数据库连接字段,默认已经有了上一步创建的连接 “localmysql”。中间部分的 SQL 编辑框,可以手写 SQL 语句,或者使用“获取SQL查询语句”,用可视化的方式来编写 SQL语句。

假设我们要抽取 film 表中的数据,SQL 语句为:

SELECT * FROM film;

点击 “预览” 按钮,出现了如下错误,截取关键行如下:

2017/11/21 09:28:26 - 表输入.0 - Unable to get value 'Date' from database resultset, index 3
2017/11/21 09:28:26 - 表输入.0 - Cannot convert value '2006' from column 4 to TIMESTAMP.

原来, MySQL 有 year 这种数据类型,Java 尝试将这种类型转换成 TIMESTAMP 出现错误。可视化的工具,在自由度上还是有所欠缺。采用强转的方式,将该字段转换成 String:

SELECT
  film_id
, title
, description
, convert(release_year using utf8) as ryear
, language_id
, original_language_id
, rental_duration
, rental_rate
, length
, replacement_cost
, rating
, special_features
, last_update
FROM film

预览成功。将抽取的数据输出至 Excel,从 “输出” 文件夹,将 “Excel输出” 组件拖至工作区,连接 “表输入” 步骤和 “Excel输出”。“Excel输出” 步骤的设置如下:

Kettle (2) - 抽取数据库表的数据_第4张图片

切换到 “字段” 页签:

Kettle (2) - 抽取数据库表的数据_第5张图片

参数化查询

如果要对数据进行筛选,可以在 SQL 语句的 where 直接写筛选的条件,也可以使用 JDBC 风格的 参数化查询 (使用问号)。参数来自上一步,可以用常量或者变量

Kettle (2) - 抽取数据库表的数据_第6张图片

自定义常量步骤:

Kettle (2) - 抽取数据库表的数据_第7张图片

切换到 “数据” 页签,限定 title 为 A 开头:

Kettle (2) - 抽取数据库表的数据_第8张图片

表输入步骤:

Kettle (2) - 抽取数据库表的数据_第9张图片

参考文档

Why you should avoid ODBC?
MySQL Convert Function

你可能感兴趣的:(#,Kettle)