Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用JAVA在Spark数据帧上调用UDF?_Java_Apache Spark_Apache Spark Sql_User Defined Functions - Fatal编程技术网

如何使用JAVA在Spark数据帧上调用UDF?

如何使用JAVA在Spark数据帧上调用UDF?,java,apache-spark,apache-spark-sql,user-defined-functions,Java,Apache Spark,Apache Spark Sql,User Defined Functions,类似的问题,但没有足够的观点来评论 根据最新的Spark,udf有两种不同的使用方式,一种是SQL,另一种是DataFrame。我找到了多个如何将udf与sql结合使用的示例,但没有找到任何关于如何直接在数据帧上使用udf的示例 o.p.针对上述问题提供的解决方案使用了\uuuuCalludf()\uuuuuuu,这是\u不推荐的\uuuu,将根据Spark Java API文档在Spark 2.0中删除。上面写着: “因为它与udf()是冗余的” 因此,这意味着我应该能够使用\uuuuudf(

类似的问题,但没有足够的观点来评论

根据最新的Spark,udf有两种不同的使用方式,一种是SQL,另一种是DataFrame。我找到了多个如何将
udf
与sql结合使用的示例,但没有找到任何关于如何直接在数据帧上使用
udf
的示例

o.p.针对上述问题提供的解决方案使用了
\uuuuCalludf()\uuuuuuu
,这是
\u不推荐的\uuuu
,将根据Spark Java API文档在Spark 2.0中删除。上面写着:

“因为它与udf()是冗余的”

因此,这意味着我应该能够使用
\uuuuudf()\uuuu
来计算我的
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?
import org.apache.spark.sql.api.java.UDF1;
.
.    
UDF1模式=新UDF1(){
公共字符串调用(最终字符串[]类型)引发异常{
返回类型[0];
}
};
sqlContext.udf().register(“mode”,mode,DataTypes.StringType);
东风。????????如何在数据帧df的给定列上调用udf(模式)?

火花>=2.3

Scala style
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();
如果UDF已注册:

sqlContext.udf().register("mode", mode, DataTypes.StringType);
您可以简单地使用(这是1.5中引入的新函数)按名称调用它:

df.select(callUDF("mode", col("vs"))).show();
您也可以在
selectExprs
中使用它:

df.selectExpr("mode(vs)").show();

事实并非如此。仔细检查签名:)一些示例代码?UDF+数据?一些格式?添加了代码来澄清我的问题。至于抱怨的部分,我有一种唠叨的感觉,我做得不对。在JavaSpark中,不需要几个小时就可以解决问题。我想我遗漏了一些东西,一些书,一些文档,一些知识来源,这些知识可以使我从IDE中获得的线索足以在不必谷歌数小时的情况下完成工作。我发现的所有东西都是Scala,我根本不清楚如何在Java中做同样的事情。从技术上讲,Scala类是有效的Java类。这意味着这些可以直接在Java中使用。问题是Scala语言比Java语言丰富得多。这意味着,如果不解开所有的Scala魔法,很多事情都无法轻松完成。所以你是说我确实需要转移到Scala。。看起来这比一直试图把火花塞进Java代码中要好。谢谢。不一定,但这比处理Scala内部更容易。首先,谢谢。udf稍微简化了一点,我最后编写的udf将返回一个字符串,该字符串是列中字符串数组的函数(逐行,无聚合)。对于spark.sql.functions套件中的其中一个函数来说,这似乎是一个完美的例子,但我所需要的(字符串数组中最常见的项)并不存在,因此我尝试开发自己的udf()。我使用Java代码成功地将spark ML“概率”向量列拆分为多个列。希望这能帮助某人比我更快地找到解决方案。在Spark>=2.3中,如何将多个列传递给答案中定义的UDF?
df.selectExpr("mode(vs)").show();