在Spark UDF JAVA中传递额外的变量

时间:2019-12-30 08:45:33

标签: java apache-spark apache-spark-sql currying

我在 JAVA 中编写了 spark UDF ,以加密数据框中的特定列。它是类型1 UDF ,并且一次只接受需要加密或解密的字符串。我也想通过相应的密码。我尝试使用currying方法,但无法正确编写函数。谁能建议我任何解决方案?

public class EncryptString implements UDF1<String, String> {


@Override
public String call(String s) throws Exception {
    return Aes256.encrypt(s);  
    //Aes.encrypt needs to have another variable password.
    //So that while calling the UDF we can pass the required password.
}
}

1 个答案:

答案 0 :(得分:1)

您可以将密码-以及任何其他参数-作为构造函数参数传递给EncryptString类:

public static class EncryptString implements UDF1<String, String> {

    private final String password; 

    public EncryptString(String password) {
        this.password = password;
    }

    public String call(String s) throws Exception { 
        return Aes256.encrypt(s, password);
    }
}

实例化udf时,您可以传递实际密码:

spark.sqlContext().udf().register("EncryptUdf", new EncryptString("secret"), DataTypes.StringType);
[...]
spark.sql("select EncryptUdf(_c2) from df").show();