注册匿名类功能

Posted

技术标签:

【中文标题】注册匿名类功能【英文标题】:Register Anonymous class functionality 【发布时间】:2020-01-12 13:45:27 【问题描述】:

在编写 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 接口并实现调用方法的 Anonymus 类。

在 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 时调用与编写的 Anonymus 类相同的功能?

我希望大家都清楚我的问题..!

谢谢

【问题讨论】:

【参考方案1】:

一个对象是否是匿名类的实例并不会改变你如何使用它和调用它的方法。

您的框架只是将 UDF 的实例存储在某处的 Map 中,并按您提供的名称进行索引。 callUDF() 方法只是从 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");

【讨论】:

使用Registry实例,你是否尝试调用registerCallback方法? 是的,这是一个错字。我输入了 register() 而不是 registerCallback()。

以上是关于注册匿名类功能的主要内容,如果未能解决你的问题,请参考以下文章

。。。事件注册方法之三。。。

匿名内部类了解一二

C#中的匿名类型

由浅入深掌握匿名类

NC65中“查询对象注册”功能在哪里?

PHP7 匿名类中的静态属性