spark>=2.3
可以直接调用scala样式的udf:
import static org.apache.spark.sql.functions.*;
import org.apache.spark.sql.expressions.UserDefinedFunction;
UserDefinedFunction mode = udf(
(Seq ss) -> ss.headOption(), DataTypes.StringType
);
df.select(mode.apply(col("vs"))).show();
spark<2.3
即使我们假定您的UDF是有用的,并且不能被简单的getitem调用替换,它的签名也不正确。使用Scala WrappedArray而不是纯Java array公开 array列,因此必须调整签名:
UDF1 mode = new UDF1, String>() {
public String call(final Seq 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();