实用工具之Kettle数据处理

标签: 无 分类: 未分类 创建时间:2022-01-11 09:04:10 更新时间:2024-11-23 10:24:25

1.前言

在数据转移之前或者之后执行一些命令,比如将某一个字段数字全部加一。

2.安装

(1) 到官网去下载,下载后进行解压到 data-integration 目录

(2) 下载 JAVA 8 242 版本,解压 zip 到 data-integration\java 目录下

(3) 设置环境变量 PENTAHO_JAVA_HOME(windows和linux设置方法不一样,不写了),指向这个 java 目录

(4) 直接找到运行 Spoon.bat ,双击运行。

3.使用

【需求】
从sql server中读取数据,将其中一列的SiteNo的值在自身的基础上加伤200,替换原先的值,保存到另外的同结构的数据库中,或者是本身的数据库中。

1.连接数据库

(1) 下载驱动文件,解压jtds,并将 jtds-1.3.1.jar 文件,放到 pdi 安装文件的lib文件夹下,我这里安装到了 :/soft/pdi-ce-9.2.0.0-290/data-integration/lib 目录下。

(2) 新建转换->工具栏上的+,添加数据库链接,选择MS SQL Server

添加两个数据库,一个是输入数据库,一个是输出数据库

参考文章:
1.ETL-Kettle学习笔记(入门,简介,简单操作)
2.從 SQL Server 使用 Kettle 同步資料到 ElasticSearch 这里有SQL Server的连接和测试方法,以及安装插件
3.[kettle入门实战(https://zhuanlan.zhihu.com/p/137383200)

2.编写流程

我这里已一个简单的数据转换开始,从表输入,到插入更新到另外的一张表中,主要就是通过插件的形式进行拖动,然后 Ctrl+Shift+鼠标左键 选中一个组件然后拖动,产生一个连线,一个步骤就算创建完成了。

  • 找到 输入->表输入,选择需要输入的表数据

  • 找到 输出->插入/更新,选择需要插入和更新的字段
    这里的用来查询的关键字就是Where要填,否则就有可能出现Where语法错误

  • 执行转换
    保存转换步骤,然后执行,可以在步骤度量中查看执行步骤

参考文章:
1.Kettle 值映射

3.编写java类

理论上,kettle的组件可以完成大部分的功能,但是我刚开始使用,没有找到将一个列的值自身加200的组件方法,于是就直接使用了Java代码的方法。在输入和输出之间,添加一个java脚本处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException
{


// First, get a row from the default input hop
//
Object[] r = getRow();

// If the row object is null, we are done processing.
//
if (r == null) {
setOutputDone();
return false;
}

// It is always safest to call createOutputRow() to ensure that your output row's Object[] is large
// enough to handle any new fields you are creating in this step.
//
Object[] outputRow = createOutputRow(r, data.outputRowMeta.size());
// 刚开始我使用了Integer类型接收 getInteger() 函数返回的数值,总是不对
// 因为我的数据库中的SittNo字段的值设置为了Integer(9),于是只能使用Long字段进行接收,
// 这部分内容我测试了很久才终于搞清楚了这个格式
Long siteno = get(Fields.In, "SiteNo").getInteger(r);

// Set the value in the output field
//
Long temp = siteno+200L;
get(Fields.Out, "SiteNo").setValue(outputRow, temp);

// putRow will send the row on to the default output hop.
//
putRow(data.outputRowMeta, outputRow);

return true;
}
参考文章:
1.kettle-如何在kettle中编写java代码 这里主要的参考文章,但是很多的部分我用不到
2.Parameter INTEGER in Table Input
3.kettle调用java代码处理数据
4.kettle 教程(四):自定义 Java 代码 这里指出了双击右侧,直接就生成了一个自动化的代码,然后在这个代码的基础上,进行了修改,不过代码都要自己手敲,作者直接贴了图片

问题

(1) Could not create the Java Virtual Machine
我在电脑上安装了JAVA8,我运行的 Spoon.bat,出现了这个问题。

[尝试]
(1) 升级java版本
后来我升级了JDK版本,弄成了13.0.1,但是在问题论坛上,有人说:它可能与 JDK-13 一起工作,但它从未被证明可以工作,查看官方文档,你会看到它只为 JDK-8 获得认证,因此,您需要安装 JDK 8 并将 PENTAHO_JAVA_HOME 指向该版本。

[解决]
重新安装回jdk1.8,然后配置了环境变量:PENTAHO_JAVA_HOME= C:\Program Files (x86)\Java\jdk1.8.0_291,双击 Spoon.bat 不再弹出错误了,但是问题是,界面一闪而过,没有图形界面产生。

继续往下解决问题。

(2) no libwebkitgtk-1.0 detected, some features will be unavailable
在linux上执行: bash spoon.sh 之后,出现了这个问题,在安装文件README.md中有说明:The libwebkitgtk package needs to be installed. This can be done by running “apt-get install libwebkitgtk-1.0.0”

[解决]
libwebkitgtk-1.0-0_2.4.11-3ubuntu3_amd64.deb 下载libwebkitgtk-1.0-0相应版本,还要下载安装依赖包,比如:libicu60、libjavascriptcoregtk-1.0-0_2.4.11-3ubuntu3_amd64,也是在上面的地址下载,可以在依赖中找到其中的deb,下载安装就可以了。


(3) windows上一闪而过,无法启动

[尝试]
1.安装了infobright_jni_64bit
infobright-core 这里下载windows版本的 infobright_jni_64bit,放到 c:/Windows/System32/ 目录下,重命名为infobright_jni.dll,然后重启了电脑

2.修改启动文件
我根据参考文章,修改了启动Spoon.bat文件,中的 “-Xms512m” “-Xmx512m”

3.运行 SpoonDebug.bat
我运行了SpoonDebug.bat,在目录下生成了 SpoonDebug.txt文件,里面有错误:Exception in thread “main” java.lang.NoClassDefFoundError: org/eclipse/swt/widgets/Control

1
2
3
4
5
6
7
8
9
10
11
12
Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/swt/widgets/Control
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
at java.lang.Class.getMethod0(Class.java:3018)
at java.lang.Class.getMethod(Class.java:1784)
at org.pentaho.commons.launcher.Launcher.main(Launcher.java:91)
Caused by: java.lang.ClassNotFoundException: org.eclipse.swt.widgets.Control
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
... 6 more

由于JAVA版本过高,不能高于 JAVA 8 242 版本。

[解决]
(1) 从下载 JAVA 8 242 版本,解压 zip
(2) 将解压后的文件放到 $PENTAHO_JAVA_HOME /java下
(3) 设置环境变量 PENTAHO_JAVA_HOME,指向该目录

参考文章:
1.运行spoon.bat时Kettle无法启动问题解决 jdk环境变量没配置好,是否电脑硬件配置太低了,是由于本机内存被占用过多,而JVM参数设置过大,导致JVM无法启动
2.java - 使用SWT时出现NoClassDefFoundError/ClassNotFoundException
3.Mac Kettle 安装 由于 jdk 版本不兼容导致,不能高于 JAVA 8 242 版本

(3) Failed to execute runnable (java.lang.NoClassDefFoundError: Could not initialize class org.pentaho.big.data.impl.cluster.NamedClusterImpl)
在创建了一个基本的输入输出之后,执行转换,结果出现了这个错误。

5.读取geojson插入mysql表中

需求:将属性信息转化到mysql数据表中,并且将id号和coordinates坐标进行保存。
解决:基本的操作方法就和参考文章1中的相似,不会的可以进行参考,大体步骤如下:

(1) 使用在线json建表工具,创建mysql中的表

(2) 使用nodejs处理geojson中的属性信息和coordinates坐标信息,转换为标准的json文件

(3) 新建转换,添加 JSON文件处理,选择需要处理的文件,选择字段,编辑映射

(4) 新建 ”插入和更新“,选择新建数据库链接

(5) 使用shift将json文件处理和插入更新处理连接

(6) 在插入更新中,选择目标表,选择->获取字段,选择->获取更新字段。

(7) 配置无误之后,保存转换步骤,执行就可以了。

参考文章:
1.Kettle(读取json数据插入或更新到MySQL数据库的t_user_1表中)
2.在线JSON转MySQL建表语句工具 先使用json在线建表工具进行建表,然后进行数据更新
3.Kettle使用Java代码处理Json文件,并写入数据库
4.kettle读取json文件并读取数据_kettle读取嵌套JSON内容的方法_Cookie Young的博客-程序员宅基地 需要解析多层级的嵌套json到关系型数据库中,这里大概讲解一下kettle的处理流程,具体原理其实和递归差不多,就是一层层嵌套的数据,像剥洋葱一样,一层一层的把他剥开,逐层解析。
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。