当前位置: 首页 > 知识库问答 >
问题:

注册匿名类功能

程瑞
2023-03-14

在编写spark代码时,我使用的是UDF(用户定义函数)。UDF是一个接口,其实现方式如下。

package sparkProject;

import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.api.java.UDF1;
import org.apache.spark.sql.types.DataTypes;

public class UDFfunctions {

    public static void registerCountryCodeFunction(SparkSession spark) {

        spark.udf().register("registerCountryCodeFunctionUDF", new UDF1<String, Integer>() {

            /**
             * 
             */
            private static final long serialVersionUID = 1L;

            @Override
            public Integer call(String t1) throws Exception {
                if (t1.toString().toUpperCase().startsWith("I")) {

                    return 01;
                }
                return 02;
            }

        }, DataTypes.IntegerType);

    }

}

所以UDF1是一个接口,里面有调用方法。当我使用UDF1接口创建一个实例时,JVM会创建一个匿名类,该类实现UDF1接口并实现调用方法。

在SPARK Api中,要使用registerCountryCodeFunctionUDF功能,我需要执行以下操作

UDFfunctions.registerCountryCodeFunction(spark);
ds2_populationGt100k_with_ia_filters_only.withColumn("countryCode", callUDF("registerCountryCodeFunctionUDF",ds2_populationGt100k_with_ia_filters_only.col("countryName")));

我想知道,我如何创建自己的UDF函数,用户可以在哪里注册它,然后在Java中使用它。。。?

简单地说,我如何在Java中创建这样的代码,当我们使用所需的参数调用callUDF时,它调用由Anonymus类编写的功能。。?需要编写什么,以便在调用callUDF时,调用与Anonymous类编写的相同的功能?

我希望我的问题对所有人来说都是清楚的。。!

谢谢

共有1个答案

邵鸿福
2023-03-14

无论一个对象是否是匿名类的实例,都不会改变您使用它和调用它的方法的方式。

您的框架只是将UDF的实例存储在Map中的某个地方,并根据您提供的名称进行索引。Call UDF()方法只需从Map中获取它并调用它的call()方法。

下面是一个做同样的事情的完整例子:

// similar to UDF, but not generic to make it easier to understand
interface Callback {
    void call(String message);
}

class Registry {
    private Map<String, Callback> callbacks = new HashMap<>();

    public registerCallback(String name, Callback callback) {
        callbacks.put(name, callback;
    }

    public void invokeCallback(String name, String message) {
        Callback cb = map.get(name);
        cb.call(message);
    }
}

现在,您可以使用实现接口的顶级类、实现接口的匿名类或lambda创建回调实例,将其注册到注册表中,并最终调用它:

Registry registry = new Registry();
registry.registerCallback("hello", new Callback() {
    @Override 
    void call(String message) {
        System.out.println("Hello, here's your message: " + message);
    }
});

registry.invokeCallback("hello", "first message");
 类似资料:
  • 本文向大家介绍Lua 匿名功能,包括了Lua 匿名功能的使用技巧和注意事项,需要的朋友参考一下 示例 创建匿名函数 匿名函数就像常规的Lua函数一样,只是它们没有名称。 如您所见,该函数未分配任何名称,例如print或add。要创建匿名函数,您要做的就是省略名称。这些函数也可以接受参数。 了解语法糖 重要的是要了解以下代码 实际上只是 但是,上述函数不是匿名的,因为该函数直接分配给变量! 函数是一

  • 本文向大家介绍Julia匿名功能,包括了Julia匿名功能的使用技巧和注意事项,需要的朋友参考一下 示例 箭头语法 可以使用->语法创建匿名函数。这对于将函数传递给高阶函数(例如函数)很有用map。下面的函数计算数组中每个数字的平方A。 使用此功能的示例: 多行语法 可以使用function语法创建多行匿名函数。例如,以下示例计算第一个n数字的阶乘,但使用匿名函数代替内置函数factorial。

  • 匿名类是指没有类名的内部类,必须在创建时使用 new 语句来声明类。其语法形式如下: 这种形式的 new 语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口。使用匿名类可使代码更加简洁、紧凑,模块化程度更高。 匿名类有两种实现方式: 继承一个类,重写其方法。 实现一个接口(可以是多个),实现其方法。 下面通过代码来说明。 程序的输出结果如下: 从输出结果可以看出,匿名内部类有

  • 注册域名 目前,web3j仅支持ENS域的解析。它不支持注册。有关如何做到这一点的说明,请参阅ENS quickstart。

  • PHP-X扩展中可以调用Extension::registerClass方法来注册PHP内置类。可以使用PHPX_ME宏实现参数简化,使用方法: Class c = new Class("CppClass"); /** * 注册构造方法 */ c->addMethod("__construct", CppClass_construct, CONSTRUCT); /** * 普通方法 */ c->a

  • 本文向大家介绍Java匿名类,匿名内部类实例分析,包括了Java匿名类,匿名内部类实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java匿名类,匿名内部类。分享给大家供大家参考,具体如下: 内部类 匿名类  首发日期 :2018-03-25 内部类: 在一个类中定义另一个类,这样定义的类称为内部类。【包含内部类的类可以称为内部类的外部类】 如果想要通过一个类来使用另一个类,可以定