gpt4 book ai didi

scala - 如何从 Scala 方法创建 UDF(计算 md5)?

转载 作者:行者123 更新时间:2023-12-02 04:27:22 25 4
gpt4 key购买 nike

我想从两个已经工作的函数构建一个 UDF。我正在尝试计算 md5 哈希作为现有 Spark Dataframe 的新列。

def md5(s: String): String = { toHex(MessageDigest.getInstance("MD5").digest(s.getBytes("UTF-8")))}
def toHex(bytes: Array[Byte]): String = bytes.map("%02x".format(_)).mkString("")

结构(到目前为止我所拥有的)

val md5_hash: // UDF Implementation
val sqlfunc = udf(md5_hash)
val new_df = load_df.withColumn("New_MD5_Column", sqlfunc(col("Duration")))

不幸的是,我不知道如何正确地实现该函数作为 UDF。

最佳答案

为什么不使用内置的 md5功能?

md5(e: Column): Column Calculates the MD5 digest of a binary column and returns the value as a 32 character hex string.

然后您可以按如下方式使用它:

val new_df = load_df.withColumn("New_MD5_Column", md5($"Duration"))

您必须确保该列是二进制类型,因此如果它是 int,您可能会看到以下错误:

org.apache.spark.sql.AnalysisException: cannot resolve 'md5(Duration)' due to data type mismatch: argument 1 requires binary type, however, 'Duration' is of int type.;;

然后,您应该使用 bin 将类型更改为 md5 兼容,即二进制类型。功能。

bin(e: Column): Column An expression that returns the string representation of the binary value of the given long column. For example, bin("12") returns "1100".

解决方案可能如下:

val solution = load_df.
withColumn("bin_duration", bin($"duration")).
withColumn("md5", md5($"bin_duration"))
scala> solution.show(false)
+--------+------------+--------------------------------+
|Duration|bin_duration|md5 |
+--------+------------+--------------------------------+
|1 |1 |c4ca4238a0b923820dcc509a6f75849b|
+--------+------------+--------------------------------+

您还可以将函数“链接”在一起,并在一个 withColumn 中进行转换和计算 MD5,但我更喜欢将步骤分开,以防出现需要解决的问题,并且中间步骤通常会有所帮助。

性能

您之所以考虑使用内置函数 binmd5 而不是自定义用户定义函数 (UDF) 的原因是您可以 可以获得更好的性能,因为 Spark SQL 处于完全控制状态,并且不会添加额外的步骤来对内部行表示进行序列化和反序列化。

enter image description here

这里的情况并非如此,但仍然需要较少的导入和使用。

关于scala - 如何从 Scala 方法创建 UDF(计算 md5)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44819019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com