Knime中集成Java代码

26 3月

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},效果如下图

发表评论

电子邮件地址不会被公开。