繁体   English   中英

如何使用JAVA在Spark DataFrame上调用UDF?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM