Apache spark 为Spark UDF执行提供上下文
我在用Scala编程语言工作。我想用sha2和salt散列数据帧的整个列。我已经实现了以下UDF,它应该采用MessageDigest和将被散列的输入字符串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
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 |
+-----------------+