[英]How do I call a UDF on a Spark DataFrame using JAVA?
类似的问题在这里 ,但没有足够的点来评论那里。
根据最新的Spark 文档 , udf
可以以两种不同的方式使用,一种使用SQL,另一种使用DataFrame。 我发现如何使用多个示例udf
通过SQL,但一直没能找到任何关于如何使用udf
直接对数据帧。
op在上面链接的问题上提供的解决方案使用__callUDF()__
,它是_deprecated_
,并将根据Spark Java API文档在Spark 2.0中删除。 在那里,它说:
“因为它与udf()是多余的”
所以这意味着我应该能够使用__udf()__
到CAL一个我的udf
,但我无法弄清楚如何做到这一点。 我没有偶然发现任何说明Java-Spark程序语法的内容。 我错过了什么?
import org.apache.spark.sql.api.java.UDF1;
.
.
UDF1 mode = new UDF1<String[], String>() {
public String call(final String[] types) throws Exception {
return types[0];
}
};
sqlContext.udf().register("mode", mode, DataTypes.StringType);
df.???????? how do I call my udf (mode) on a given column of my DataFrame df?
Spark> = 2.3
可以直接调用Scala样式的udf
:
import static org.apache.spark.sql.functions.*;
import org.apache.spark.sql.expressions.UserDefinedFunction;
UserDefinedFunction mode = udf(
(Seq<String> ss) -> ss.headOption(), DataTypes.StringType
);
df.select(mode.apply(col("vs"))).show();
Spark <2.3
即使我们假设您的UDF很有用并且不能被简单的getItem
调用替换,它也有不正确的签名。 使用Scala WrappedArray
而不是普通的Java Arrays公开数组列,因此您必须调整签名:
UDF1 mode = new UDF1<Seq<String>, String>() {
public String call(final Seq<String> types) throws Exception {
return types.headOption();
}
};
如果UDF已经注册:
sqlContext.udf().register("mode", mode, DataTypes.StringType);
你可以简单地使用callUDF
(1.5中引入的新函数)来按名称调用它:
df.select(callUDF("mode", col("vs"))).show();
您也可以在selectExprs
使用它:
df.selectExpr("mode(vs)").show();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.