将行中的每一列传递到 Spark SQL 中的哈希函数

Sco*_*ell 4 python apache-spark apache-spark-sql pyspark

我有一个包含N列的表,我想将它们全部连接到一个字符串列,然后对该列执行哈希。我在 Scala 中发现了类似的问题。

理想情况下,我想完全在 Spark SQL 内部完成此操作,我已经尝试过HASH(*) as myhashcolumn,但由于几列有时为空,我无法按预期完成这项工作。

如果我必须创建一个 UDF 并注册它才能实现这一点,我需要使用 Python 而不是 Scala,因为我的所有其他代码都使用 Python。

有任何想法吗?

小智 5

如果你想根据 DataFrame 的所有列动态生成哈希,可以使用:

import pyspark.sql.functions as F

df.withColumn("checksum", F.xxhash64(*df.schema.names))
Run Code Online (Sandbox Code Playgroud)

说明:
df.schema.names是一个包含 DataFrame 中所有列名称的列表df。使用 a*将此列表扩展到它包含的元素中。然后,您可以将元素传递给xxhash64(对于 64 位哈希值)和hash(对于 32 位哈希值)等函数。