Kettle-Java代码:分布式Id生成器

当使用Kettle导入数据到数据表时,由于使用的是Oracle,所以自然而然想到使用增加序列对象去获取一个Id,但是经过测试这种方式非常慢。

以下对比2种不同方式的导入速度:

  • 序列生成Id
  • 分布式Id生成器

速度比较

序列

转换

转换

执行结果

执行结果

从图片可以看出来,使用序列生成Id的方式,导入数据是会非常慢。10分钟才导入2w多条记录。

分布式Id生成器

请参考:分布式Id生成器

使用

将以上 分布式Id生成器 文章的代码打包成jar包,放到kettle/lib文件夹下。假设包名、类名:cn.tisson.common.keygen.SnowflakeKeyGenerator.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
import java.lang.*;
// 一定要在这里初始化,不能在函数体里面,否则导致每处理一行记录,都会初始化一次生成器,从而导致会出现重复Id
cn.tisson.common.keygen.SnowflakeKeyGenerator snowflake = new cn.tisson.common.keygen.SnowflakeKeyGenerator();
String snowFlowIdFeild;
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;
}

// Let's look up parameters only once for performance reason.
if (first) {
snowFlowIdFeild = getParameter("SNOWFLOW_ID_FEILD");
first=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());

// 获取分布式 Id
String id = String.valueOf(snowflake.generateKey());
// logBasic("id: " + id);

get(Fields.Out, snowFlowIdFeild).setValue(outputRow, id);

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

Java代码

  • 字段配置

    字段名:snowflake_id

    类型:String

  • 参数配置

    标签:SNOWFLOW_ID_FEILD

    值:snowflake_id

执行结果

执行结果

  • 本文作者: forever杨
  • 本文链接: https://blog.yl-online.top/posts/4f2ec68b.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。如果文章内容对你有用,请记录到你的笔记中。本博客站点随时会停止服务,请不要收藏、转载!