本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
转载自夜明的孤行灯
本文链接地址: https://www.huangyunkun.com/2019/03/26/knime-java-snippet/
Knime是一个非常强大的数据分析平台,支持常用的各种数据清洗,分析等功能。
但是有些时候数据的预处理,比如打标记等等需要一些外部逻辑,这种时候用java代码可能更快。
为了让数据处理更流畅,而不是在Knime中输出一个中间结果,然后在放回Knime中继续这样断断续续的方法,Knime提供了各种语言的集成,比如Java,Python等。其中Java代码的集成是原生支持的,而Python等语言是需要安装插件的。
这里用阿里天池全球城市计算AI挑战赛的数据作为说明。
假定我们读取文件每次只读取同一天的数据,比如要计算星期二的,就只读取同样为星期二的历史数据。workflows需要用到
- List Files
- Java Snippet
- Rule-based Row Filter
- Table Row To Variable Loop Start
- CSV Reader

其中List Files可以将指定目录的文件全部列出

然后我们在Java Snippet中写逻辑过滤就行了,这里追加一个星期标识
// system imports
import org.knime.base.node.jsnippet.expression.AbstractJSnippet;
import org.knime.base.node.jsnippet.expression.Abort;
import org.knime.base.node.jsnippet.expression.Cell;
import org.knime.base.node.jsnippet.expression.ColumnException;
import org.knime.base.node.jsnippet.expression.TypeException;
import static org.knime.base.node.jsnippet.expression.Type.*;
import java.util.Date;
import java.util.Calendar;
import org.w3c.dom.Document;
// Your custom imports:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
// system variables
public class JSnippet extends AbstractJSnippet {
// Fields for input columns
/** Input column: "Location" */
public String c_Location;
/** Input column: "URL" */
public String c_URL;
// Fields for input flow variables
/** Input flow variable: "target-data" */
public String v_targetdata;
// Fields for output columns
/** Output column: "fileDayOfWeek" */
public Integer out_fileDayOfWeek;
/** Output column: "dayOfWeek" */
public Integer out_dayOfWeek;
// Your custom variables:
// expression start
public void snippet() throws TypeException, ColumnException, Abort {
// Enter your code here:
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd");
DateTime dateTime = formatter.parseDateTime(v_targetdata);
out_dayOfWeek = dateTime.getDayOfWeek();
Pattern pattern = Pattern.compile("record_(\\S+).csv");
Matcher matcher = pattern.matcher(c_URL);
if (matcher.find()) {
out_fileDayOfWeek = formatter.parseDateTime(matcher.group(1)).getDayOfWeek();
} else {
out_fileDayOfWeek = -1;
}
// expression end
}
}

这里的代码就是普通的Java代码,其中还引用了joda作为三方库。Knime默认自带了一些常用Java三方库,也可以自己添加。
一般输入就是c_{Column Name},而输出是out_{Column Name},效果如下图

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
转载自夜明的孤行灯
本文链接地址: https://www.huangyunkun.com/2019/03/26/knime-java-snippet/