当前位置: 首页 > 面试题库 >

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

庞乐池
2023-03-14
问题内容

与此处类似的问题,但在此处没有足够的评论要点。

根据最新的Spark 文档,udf可以两种不同的方式使用,一种用于SQL,另一种用于DataFrame。我找到了多个如何udf与sql
一起使用的示例,但还没有找到有关如何udf直接在DataFrame上使用a的任何示例。

op所提供的解决方案,在上面链接的问题上使用__callUDF()___deprecated_根据Spark Java
API文档,该解决方案将在Spark 2.0中删除。在那里,它说:

“因为它在udf()中是多余的”

因此,这意味着我应该能够使用__udf()__my进行校准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?

问题答案:

火花 > = 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();

火花 <2.3

即使我们假设您的UDF有用并且不能被简单的getItem调用替换,它的签名也不正确。数组列是使用Scala
WrappedArray而不是普通Java数组公开的,因此您必须调整签名:

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();


 类似资料:
  • 类似的问题,但没有足够的观点来评论。 根据最新的Spark文档,< code>udf有两种不同的用法,一种用于SQL,另一种用于DataFrame。我找到了许多关于如何在sql中使用< code>udf的例子,但是还没有找到任何关于如何在数据帧中直接使用< code>udf的例子。 o.p.针对上述问题提供的解决方案使用,这是,将根据Spark Java API文档在Spark 2.0中删除。在那

  • 问题内容: 任何人都可以指导如何使用GDB调试器在Linux上调试JNI代码(如果可能,请提出其他选择)。 我已经安装了Gdb,但是没有得到如何使用它调试项目的信息。我是否还需要使用-g选项t debug .so文件来编译.cpp文件? 问题答案: 启动您的Java应用程序 使用top,ps,…查找pid 使用此pid启动gdb 附加程序代码 像往常一样使用gdb进行调试 这篇博客文章解释了整个过

  • 本文向大家介绍如何使用JAVA调用SHELL,包括了如何使用JAVA调用SHELL的使用技巧和注意事项,需要的朋友参考一下 通过ProcessBuilder进行调度 这种方法比较直观,而且参数的设置也比较方便, 比如我在实践中的代码(我隐藏了部分业务代码): 这里有必要解释一下几个参数: RUNNING_SHELL_FILE:要运行的脚本 SHELL_FILE_DIR:要运行的脚本所在的目录; 当

  • 我用那个代码来控制我的android设备剪贴板,但是它给了我错误。我在远程设备Android6.0上测试这段代码。这是我的错误 Oct 06,2018年7:47:01 AM org.openqa.selenium.remote.errorcodes to status info:HTTP status:“404”->线程“main”org.openqa.selenium.unsupportedCo

  • 我在DialogFlow的官方网站上使用Node.js找到了这个示例,它运行良好,但我不知道如何将其集成到我的web应用程序中。 我可以将它集成到我的其他javascript jquery代码中吗?这里我需要运行节点index.js,但是如果我与代码集成,我还需要这样做吗? DialogFlow v1使用起来非常简单。我有这样的东西:

  • 问题内容: 我很难找到有关如何使用Android调用标准SOAP / WSDL Web服务的良好信息。我所能找到的只是非常复杂的文档和对“ kSoap2”的引用,然后是一些有关使用SAX手动解析它们的内容。好的,很好,但是是2008年,所以我认为应该有一些好的库来调用标准Web服务。 Web服务基本上只是在NetBeans中创建的一种。我希望IDE支持生成管道类。我只需要最简单/最优雅的方法就可以