搜尋
首頁資料庫mysql教程详解kettle之UserDefinedJavaClass步骤(二)

详解User Defined Java Class步骤(二) kettle中的user defined java class步骤,也称UDJC步骤,从4.0版本就有,功能非常强大,无所不能;可以在其中写任意代码,却不影响效率。本文将详细介绍在不同场景中用示例展示如果使用该步骤,由于内容非常多,便于

详解User Defined Java Class步骤(二)

kettle中的“user defined java class”步骤,也称UDJC步骤,从4.0版本就有,功能非常强大,无所不能;可以在其中写任意代码,却不影响效率。本文将详细介绍在不同场景中用示例展示如果使用该步骤,由于内容非常多,便于阅读方便,把内容分成三部分,请完整看完全部内容,示例代码在这里下载.

如果没有从第一部分开始,请访问第一部分。

使用步骤参数(Step Parameter)

如果你写了一段代码,如果想让带更通用,步骤参数这时就能用到;在示例中,我们提供一个正则表达式和一个字段的名称,该步骤检查参数对应的字段是否匹配正则表达式,如果是返回结果为1,反之为0。

\

代码如下:

import java.util.regex.Pattern;

 

private Pattern p = null;

private FieldHelper fieldToTest = null;

private FieldHelper outputField = null;

 

public boolean processRow(StepMetaInterfacesmi, StepDataInterface sdi) throws KettleException

{

Object[] r = getRow();

if (r == null) {

setOutputDone();

return false;

}

// prepare regex and field helpers

if (first){

first = false;

String regexString = getParameter("regex");

p = Pattern.compile(regexString);

fieldToTest = get(Fields.In, getParameter("test_field"));

outputField = get(Fields.Out, "result");

}

r= createOutputRow(r, data.outputRowMeta.size());

 

// Get the value from an input field

String test_value = fieldToTest.getString(r);

// test for match and write result

if (p.matcher(test_value).matches()){

outputField.setValue(r, Long.valueOf(1));

}

else{

outputField.setValue(r, Long.valueOf(0));

}

// Send the row on to the next step.

putRow(data.outputRowMeta, r);

return true;

}

\

getParameter()方法返回在ui界面中定义的参数对应值内容,当然参数的值也可能是kettle的变量。把变量作为参数是使用变量通常的做法。我们可以在步骤的xml代码中手工搜索到变量。

示例的转换名称是:parameter.ktr.

 

消息步骤(Info Steps)使用

有时需要合并多个输入步骤,可能赋予不同的角色,就如流查询步骤。消息步骤用来提供查询,其数据行不通过getRow()方法返回。在udjc步骤中非常容易使用。在udjc步骤的ui界面消息步骤选项卡中定义,通过getRowsFrom()方法返回对应的值。

示例转换中使用消息步骤接收一组正则表达式,用其测试主流数据中的一个字段是否匹配,如果任何一个表达式匹配,结果字段设置为1.如果没有任何匹配,则结果为0,同时附加输出匹配的表达式。

\

代码如下:

import java.util.regex.Pattern;

import java.util.*;

 

private FieldHelper resultField = null;

private FieldHelper matchField = null;

private FieldHelper outputField = null;

private FieldHelper inputField = null;

private ArrayList patterns = newArrayList(20);

private ArrayList expressions = newArrayList(20);

 

public boolean processRow(StepMetaInterfacesmi, StepDataInterface sdi) throws KettleException

{

Object[] r = getRow();

 

if (r == null) {

setOutputDone();

return false;

}

 

// prepare regex and field helpers

if (first){

first = false;

// get the input and output fields

resultField = get(Fields.Out, "result");

matchField = get(Fields.Out, "matched_by");

inputField = get(Fields.In, "value");

 

// get all rows from the info stream andcompile the regex field to patterns

FieldHelper regexField = get(Fields.Info, "regex");

RowSet infoStream = findInfoRowSet("expressions");

 

Object[] infoRow = null;

while((infoRow = getRowFrom(infoStream)) != null){

String regexString = regexField.getString(infoRow);

expressions.add(regexString);

patterns.add(Pattern.compile(regexString));

}

 

}

 

// get the value of the field to check

String value = inputField.getString(r);

 

// check if any pattern matches

int matchFound = 0;

String matchExpression = null;

for(int i=0;i

if (((Pattern) patterns.get(i)).matcher(value).matches()){

matchFound = 1;

matchExpression = (String)expressions.get(i);

break;

}

}

 

// write result to stream

r= createOutputRow(r, data.outputRowMeta.size());

resultField.setValue(r, Long.valueOf(matchFound));

matchField.setValue(r, matchExpression);

 

// Send the row on to the next step.

putRow(data.outputRowMeta, r);

 

return true;

}

\

调用findInfoRowSet()方法,返回在udjc步骤的消息步骤中定义的名称对应的输入步骤的整个行集内容。从行集内容中读取某行与从主数据流中去某行不同,通过调用getRowFrom(),并显示指明那个行集。

示例转换的名称为info_steps.ktr.

 

使用目标步骤(Target Steps)

使用udjc步骤有时可能需要指定行集流转到不同的目标步骤。通过调用putRow()方法,并传递一个目标步骤作为参数。我们需要在udjc步骤的ui界面的目标步骤中定义所有可能的目标步骤,下面示例中随机分发行数据到不同弄的目标步骤。

findTargetRowSet()方法返回在ui界面中定义的目标步骤行集,并作为putRowto()方法的参数.示例转换的名称为target_steps.ktr.

\

代码如下:

import java.util.regex.Pattern;

import java.util.*;

 

private RowSet lowProbStream = null;

private RowSet highProbStream = null;

 

public boolean processRow(StepMetaInterfacesmi, StepDataInterface sdi) throws KettleException

{

Object[]r = getRow();

 

if(r == null) {

setOutputDone();

returnfalse;

}

 

//prepare regex and field helpers

if (first){

first = false;

lowProbStream= findTargetRowSet("low_probability");

highProbStream= findTargetRowSet("high_probability");

}

 

//Send the row on to the next step.

if(Math.random()

putRowTo(data.outputRowMeta, r,lowProbStream);

}

else{

putRowTo(data.outputRowMeta, r,highProbStream);

}

 

returntrue;

}

\

 

更多内容请查看第三部分;

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
MySQL和其他SQL方言之間的語法有什麼區別?MySQL和其他SQL方言之間的語法有什麼區別?Apr 27, 2025 am 12:26 AM

mysqldiffersfromothersqldialectsinsyntaxforlimit,自動啟動,弦樂範圍,子征服和表面上分析。 1)MySqluessLipslimit,whilesqlserverusestopopandoraclesrontersrontsrontsrontsronnum.2)

什麼是mysql分區?什麼是mysql分區?Apr 27, 2025 am 12:23 AM

MySQL分區能提升性能和簡化維護。 1)通過按特定標準(如日期範圍)將大表分成小塊,2)物理上將數據分成獨立文件,3)查詢時MySQL可專注於相關分區,4)查詢優化器可跳過不相關分區,5)選擇合適的分區策略並定期維護是關鍵。

您如何在MySQL中授予和撤銷特權?您如何在MySQL中授予和撤銷特權?Apr 27, 2025 am 12:21 AM

在MySQL中,如何授予和撤銷權限? 1.使用GRANT語句授予權限,如GRANTALLPRIVILEGESONdatabase_name.TO'username'@'host';2.使用REVOKE語句撤銷權限,如REVOKEALLPRIVILEGESONdatabase_name.FROM'username'@'host',確保及時溝通權限變更。

說明InnoDB和Myisam存儲引擎之間的差異。說明InnoDB和Myisam存儲引擎之間的差異。Apr 27, 2025 am 12:20 AM

InnoDB適合需要事務支持和高並發性的應用,MyISAM適合讀多寫少的應用。 1.InnoDB支持事務和行級鎖,適用於電商和銀行系統。 2.MyISAM提供快速讀取和索引,適合博客和內容管理系統。

MySQL中有哪些不同類型的連接?MySQL中有哪些不同類型的連接?Apr 27, 2025 am 12:13 AM

MySQL中有四種主要的JOIN類型:INNERJOIN、LEFTJOIN、RIGHTJOIN和FULLOUTERJOIN。 1.INNERJOIN返回兩個表中符合JOIN條件的所有行。 2.LEFTJOIN返回左表中的所有行,即使右表中沒有匹配的行。 3.RIGHTJOIN與LEFTJOIN相反,返回右表中的所有行。 4.FULLOUTERJOIN返回兩個表中所有符合或不符合JOIN條件的行。

MySQL中有哪些不同的存儲引擎?MySQL中有哪些不同的存儲引擎?Apr 26, 2025 am 12:27 AM

mysqloffersvariousStorageengines,每個suitedfordferentusecases:1)InnodBisidealForapplicationsNeedingingAcidComplianCeanDhighConcurncurnency,supportingtransactionsancions and foreignkeys.2)myisamisbestforread-Heavy-Heavywyworks,lackingtransactionsactionsacupport.3)記憶

MySQL中有哪些常見的安全漏洞?MySQL中有哪些常見的安全漏洞?Apr 26, 2025 am 12:27 AM

MySQL中常見的安全漏洞包括SQL注入、弱密碼、權限配置不當和未更新的軟件。 1.SQL注入可以通過使用預處理語句防止。 2.弱密碼可以通過強制使用強密碼策略避免。 3.權限配置不當可以通過定期審查和調整用戶權限解決。 4.未更新的軟件可以通過定期檢查和更新MySQL版本來修補。

您如何確定MySQL中的慢速查詢?您如何確定MySQL中的慢速查詢?Apr 26, 2025 am 12:15 AM

在MySQL中識別慢查詢可以通過啟用慢查詢日誌並設置閾值來實現。 1.啟用慢查詢日誌並設置閾值。 2.查看和分析慢查詢日誌文件,使用工具如mysqldumpslow或pt-query-digest進行深入分析。 3.優化慢查詢可以通過索引優化、查詢重寫和避免使用SELECT*來實現。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。