Knime是一个非常强大的数据分析平台,支持常用的各种数据清洗,分析等功能。
但是有些时候数据的预处理,比如打标记等等需要一些外部逻辑,这种时候用java代码可能更快。
为了让数据处理更流畅,而不是在Knime中输出一个中间结果,然后在放回Knime中继续这样断断续续的方法,Knime提供了各种语言的集成,比如Java,Python等。其中Java代码的集成是原生支持的,而Python等语言是需要安装插件的。
这里用阿里天池全球城市计算AI挑战赛的数据作为说明。
假定我们读取文件每次只读取同一天的数据,比如要计算星期二的,就只读取同样为星期二的历史数据。workflows需要用到
其中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},效果如下图