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

3

目前有没有办法在PySpark dataframe中基于特定字段的唯一值生成UUID?

我知道Pandas可以很容易地做到我想要的事情,但如果我想为我的pyspark dataframe的每一行基于特定列属性给出唯一的UUID,我该怎么做呢?

假设我有一个如下所示的pandas 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

我希望您能够为我翻译一些与IT技术相关的内容。需要翻译的内容是:在名称相同的情况下,我想添加一个具有相同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进行此操作的示例。

1
我觉得我知道你想要什么,但为了确认,你能提供一个能够重现的示例数据和期望的输出吗?这样做不仅可以帮助他人理解你的问题,也可以确保准确无误地回答。 - murtihash
1
像我刚刚粘贴的那个东西一样吗? - Manas Jani
1
关于你行的SHA256哈希值如何? - pault
1个回答

3
你实际想要的是应用一个哈希函数。在相同的值上应用哈希函数将始终输出相同的结果。另一方面,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

UUIDs是128位整数,但并非所有的128位整数都是有效的UUID。以下是一个无效的UUID示例:00000000-0000-6000-f000-000000000000,其中版本号为6(不存在),变体无效(以0位结尾)。了解更多 - János Roden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接