数据库表是 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连接”,鼠标右键,选择“新建数据库连接向导”。
点击 “Next” 按钮,连接到本地数据库,服务器主机名:localhost,“数据库” 输入 sakila,这是 MySQL 提供的示例数据库,可以在官网下载并且导入。
点击 “Next” 按钮,输入用户名和密码,测试连接,如果连接成功,点击 “确定” 按钮,完成到数据库的连接。
从数据库表抽取数据,需要用到 “表输入” 控件。从 “输入” 文件夹下,选择 “表输入” 组件,拖放到右边的工作区。双击:
我们看到,数据库连接字段,默认已经有了上一步创建的连接 “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输出” 步骤的设置如下:
切换到 “字段” 页签:
如果要对数据进行筛选,可以在 SQL 语句的 where 直接写筛选的条件,也可以使用 JDBC 风格的 参数化查询 (使用问号)。参数来自上一步,可以用常量或者变量:
自定义常量步骤:
切换到 “数据” 页签,限定 title 为 A 开头:
表输入步骤:
Why you should avoid ODBC?
MySQL Convert Function