覆盖主要内容
版本: 6.1.0

Java 代码

组件介绍

Java 代码组件支持用户编写并执行自定义 Java 类代码,在数据流水线中实现灵活、个性化的数据处理逻辑。

组件底层基于 Janino 项目库,可在运行时动态编译 Java 代码为可执行类,兼顾代码灵活性与执行效率。该组件并非用于全量 Java 应用开发(平台提供完整插件体系满足此类需求),核心定位是让用户以极简代码实现自定义数据处理规则,快速适配个性化业务场景。


  • 输入:接收上游组件传入的待处理数据流,支持在代码中读取输入行的任意字段
  • 输出:输出经 Java 逻辑处理后的数据流,支持自定义新增输出字段,也可对输入字段进行修改、过滤后输出

页面介绍

运行Java代码组件得到下图所示的界面:

界面核心分为代码编辑区与底部配置页签两大部分:代码编辑区默认提供processRow核心方法模板,用于编写逐行数据处理逻辑;底部配置页签包含字段、参数、消息 Transform、目标 Transform 四大配置模块,各模块说明如下:

字段页签

字段页签用于定义组件的输出字段,配置完成的输出字段可在 Java 代码中进行赋值与输出。页签内的字段配置表包含以下列:

选项说明样例值
字段名自定义输出字段的名称,需保证唯一性name_field
类型指定输出字段的数据类型。String
长度该字段中数据的长度50
精度该字段中数据的精度2

参数页签

参数页签用于定义组件的命名参数,可在代码中通过getParameter()方法读取参数值,避免在代码中硬编码字段名、固定配置值等内容,提升代码的可维护性与复用性。参数配置表包含以下列:

选项说明样例值
标签参数的唯一标识名称,代码中通过该标签读取参数值FIRSTNAME_FIELD
参数的默认取值first_name
描述有关该参数的描述。姓氏字段名

消息 Transform 页签

消息 Transform 页签用于配置额外的数据源 Transform,支持在 Java 代码中读取来自其他 Transform 的数据流,实现多源数据的关联读取与处理。消息 Transform 配置表包含以下列:

选项说明样例值
标签Transform 的唯一标识标签,代码中通过该标签定位目标 Transformsource_data
Trans数据源 Transform 的名称,需与转换流中已有的 Transform 名称一致自定义常量数据
描述对该 Transform 配置用途的补充说明主数据源 Transform

目标 Transform 页签

目标 Transform 页签用于配置额外的输出目标 Transform,支持在 Java 代码中将处理后的数据输出到指定的下游 Transform,实现多分支的数据分流输出。目标 Transform 配置表包含以下列:

选项说明样例值
标签目标 Transform 的唯一标识标签,代码中通过该标签定位输出目标output_sink
Trans输出目标 Transform 的名称,需与流水线中已有的 Transform 名称一致数据输出
描述对该目标 Transform 配置用途的补充说明主数据输出目标

使用案例

本示例通过自定义常量数据组件生成姓氏与名字的基础数据,再通过Java 代码组件实现姓氏与名字的拼接,生成完整姓名字段。

步骤 1:前置数据源配置

  1. 使用自定义常量数据组件,配置first_name(姓氏)与last_name(名字)两个字段,生成基础数据,基础数据如下:

步骤 2:Java 代码组件配置

  1. 命名参数配置

打开Java 代码组件的「参数」页签,配置以下命名参数,用于映射输入输出字段名,避免硬编码:

  1. 处理代码编写
    在代码编辑区编写逐行数据处理逻辑,完整代码如下:
String firstnameField;
String lastnameField;
String nameField;

public boolean processRow() throws HopException
{
// 仅在首行执行一次参数加载,提升处理性能
if (first) {
firstnameField = getParameter("FIRSTNAME_FIELD");
lastnameField = getParameter("LASTNAME_FIELD");
nameField = getParameter("NAME_FIELD");
first = false;
}

// 获取当前输入行数据
Object[] r = getRow();

// 输入行为空,代表无后续数据,结束处理
if (r == null) {
setOutputDone();
return false;
}

// 创建输出行对象,确保容量适配输出字段数量,避免数组越界
Object[] outputRow = createOutputRow(r, data.outputRowMeta.size());

// 从输入行读取姓氏和名字
String firstname = get(Fields.In, firstnameField).getString(r);
String lastname = get(Fields.In, lastnameField).getString(r);

// 拼接生成完整姓名
String name = firstname+lastname;

// 将完整姓名赋值到输出字段
get(Fields.Out, nameField).setValue(outputRow, name);

// 将输出行发送到默认下游组件
putRow(data.outputRowMeta, outputRow);

return true;
}
  1. 输出字段配置 进入「字段」页签,新增输出字段name_field,类型设置为String,配置对应长度。

步骤3:结果预览 完成配置后,右键点击Java 代码组件,选择【预览】,即可查看处理后的结果数据: