根据字段的唯一值在PySpark数据帧中生成UUID



当前是否没有办法根据字段的唯一值在PySpark数据帧中生成UUID?

我知道Pandas可以很容易地做我想要的事情,但如果我想实现基于特定列属性为pyspark数据帧的每一行提供唯一的UUID,我该怎么做?

假设我有一个熊猫DataFrame,就像这样:

df = pd.DataFrame({'Name': ['John Doe', 'Jane Smith', 'John Doe', 'Jane Smith','Jack Dawson','John Doe']})
df:
Name
0   John Doe
1   Jane Smith
2   John Doe
3   Jane Smith
4   Jack Dawson
5   John Doe

如果名称相同,我想添加一个具有相同uuid的列。例如,上面的DataFrame应该变成:

df:
Name        UUID
0   John Doe    6d07cb5f-7faa-4893-9bad-d85d3c192f52
1   Jane Smith  a709bd1a-5f98-4d29-81a8-09de6e675b56
2   John Doe    6d07cb5f-7faa-4893-9bad-d85d3c192f52
3   Jane Smith  a709bd1a-5f98-4d29-81a8-09de6e675b56
4   Jack Dawson 6a495c95-dd68-4a7c-8109-43c2e32d5d42
5   John Doe    6d07cb5f-7faa-4893-9bad-d85d3c192f52
import uuid
for name in df['Name'].unique():
df.loc[df['Name'] == name, 'UUID'] = uuid.uuid4()

我试着到处搜索,但找不到用PySpark这样做的例子。

您实际想要的是应用一个散列函数。应用于相同值的哈希函数将始终输出相同的结果。另一方面,UUID只是一个128位的整数,所以只需应用128位的哈希函数并将结果解释为UUID。例如,MD5就是这样一个散列函数。

import hashlib
import uuid
def compute_uuid(name: str) -> uuid.UUID:
digest = hashlib.md5(name.encode()).digest()
return uuid.UUID(bytes=digest)
assert compute_uuid('alice') != compute_uuid('bob')

您可以将此新功能应用于数据帧

df['UUID'] = [compute_uuid(name) for name in df['Name']]

应用于你的示例数据帧我得到

Name                                  UUID
0     John Doe  4c2a904b-afba-0659-1225-113ad17b5cec
1   Jane Smith  71768b5e-2a0b-3697-eb3c-0c6d4ebbbaf8
2     John Doe  4c2a904b-afba-0659-1225-113ad17b5cec
3   Jane Smith  71768b5e-2a0b-3697-eb3c-0c6d4ebbbaf8
4  Jack Dawson  ba4f82d8-ef72-6e37-eb87-e5c3b0dce9e3
5     John Doe  4c2a904b-afba-0659-1225-113ad17b5cec

最新更新