Apache spark 为Spark UDF执行提供上下文

Apache spark 为Spark UDF执行提供上下文,apache-spark,apache-spark-sql,user-defined-functions,Apache Spark,Apache Spark Sql,User Defined Functions,我在用Scala编程语言工作。我想用sha2和salt散列数据帧的整个列。我已经实现了以下UDF,它应该采用MessageDigest和将被散列的输入字符串 val md = MessageDigest.getInstance("SHA-256") val random = new SecureRandom(); val salt: Array[Byte] = new Array[Byte](16) random.nextBytes(salt) md.update(salt

我在用Scala编程语言工作。我想用sha2和salt散列数据帧的整个列。我已经实现了以下UDF,它应该采用MessageDigest和将被散列的输入字符串

  val md = MessageDigest.getInstance("SHA-256")

  val random = new SecureRandom();
  val salt: Array[Byte] = new Array[Byte](16)
  random.nextBytes(salt)
  md.update(salt)

  dataFrame.withColumn("ColumnName", Sqlfunc(md, col("ColumnName")))

  ....some other code....

  val HashValue: ((MessageDigest, String) => String) = (md: MessageDigest, input: String) =>
  {
    val hashedPassword: Array[Byte] = md.digest(input.getBytes(StandardCharsets.UTF_8))
    val sb: StringBuilder = new StringBuilder
    for (b <- hashedPassword) {sb.append(String.format("%02x", Byte.box(b)))}
    sb.toString();
  }

  val Sqlfunc = udf(HashValue)
val md=MessageDigest.getInstance(“SHA-256”)
val random=new SecureRandom();
val salt:数组[字节]=新数组[字节](16)
随机。下一字节(盐)
md.update(salt)
dataFrame.withColumn(“ColumnName”,Sqlfunc(md,col(“ColumnName”))
……其他一些代码。。。。
val HashValue:((MessageDigest,String)=>String)=(md:MessageDigest,input:String)=>
{
val hashedPassword:Array[Byte]=md.digest(input.getBytes(StandardCharsets.UTF_8))
val sb:StringBuilder=新StringBuilder

对于(b而言,
MessageDigest
不在您的数据中。它只是UDF评估的上下文。此类上下文通过提供

有许多方法可以达到预期的效果。以下是使用函数的有用模式:

对象X扩展了可序列化{
导入org.apache.spark.sql.expressions.UserDefinedFunction
导入org.apache.spark.sql.functions.udf
def foo(上下文:字符串)(arg1:Int,arg2:Int):字符串=
context.slice(arg1、arg2)
def udfFoo(上下文:字符串):UserDefinedFunction=
udf(foo(上下文)u2;
}
试一试:

spark.range(1).toDF
  .select(X.udfFoo("Hello, there!")('id, 'id + 5))
  .show(false)
产生

+-----------------+
|UDF(id, (id + 5))|
+-----------------+
|Hello            |
+-----------------+

这回答了你的问题吗?不,没有。解决方案没有对dataframe的引用。老实说,我甚至不知道如何在udf中传递参数。感谢Sim,我已经将代码更改为dataframe。withColumn(“ColumnName”,udfHash2(md)(coln(“ColumnName”))def udfHash2(md:MessageDigest):UserDefinedFunction=udf(hash2)(md)def hash2(md:MessageDigest)(输入:String):String={val hashedPassword:Array[Byte]=md.digest(input.getBytes(StandardCharsets.utf8))val sb:StringBuilder=new StringBuilder for(b您的代码看起来不错。您如何知道函数没有被调用?与其重写
ColumnName
,不如添加一个不同的列。如果返回的数据缺少该列,则表明您根本没有使用转换。
+-----------------+
|UDF(id, (id + 5))|
+-----------------+
|Hello            |
+-----------------+