一次在多个 Spark DataFrame 列上运行

br0*_*ipe 1 md5 scala user-defined-functions dataframe apache-spark

我需要一次计算多个数据帧列的 md5 哈希。

功能

def md5 = udf((s: String) => toHex(MessageDigest.getInstance("MD5").digest(s.getBytes("UTF-8"))))
def toHex(bytes: Array[Byte]): String = bytes.map("%02x".format(_)).mkString("")
Run Code Online (Sandbox Code Playgroud)

一列示例

var test_df = load_df.as('a).select($"a.attr1", md5($"a.attr2").as("hash_key"))

+-------------+--------------------+
|     attr1   |            hash_key|
+-------------+--------------------+
|9/1/2015 0:23|7a2f516dad8f13ae1...|
|9/1/2015 0:31|339c72b1870c3a6be...|
|9/1/2015 0:19|7065847af7abc6bce...|
|9/1/2015 1:32|38c7276958809893b...|
Run Code Online (Sandbox Code Playgroud)

一列(a.attr2)的生成效果很好,但我找不到任何好方法将多列插入/连接到 md5() 函数中。

eli*_*sah 5

你应该使用concat_ws如下:

md5(concat_ws(",",$"a.attr2",$"a.attr3",$"a.attr4"))
Run Code Online (Sandbox Code Playgroud)

这是一个例子:

Seq(("a","b","c")).toDF("x","y","z").withColumn("foo", md5(concat_ws(",",$"x",$"y",$"z"))).show(false)
// +---+---+---+--------------------------------+
// |x  |y  |z  |foo                             |
// +---+---+---+--------------------------------+
// |a  |b  |c  |a44c56c8177e32d3613988f4dba7962e|
// +---+---+---+--------------------------------+
Run Code Online (Sandbox Code Playgroud)