Генерация UUID в фрейме данных PySpark на основе уникального значения поля - PullRequest
1 голос
/ 10 апреля 2020

Нет ли способа создать UUID в фрейме данных PySpark на основе уникального значения поля?

Я понимаю, что Pandas может сделать что-то вроде того, что я хочу очень легко, но если я хочу Как добиться этого, чтобы получить уникальный UUID для каждой строки моего фрейма данных pyspark на основе указанного атрибута столбца c?

Скажем, у меня есть 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

И я хочу добавить столбец с одинаковыми uuids, если имя совпадает. Например, приведенный выше 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 Ответ

0 голосов
/ 11 апреля 2020

На самом деле вы хотите применить га sh функцию . Функция ha sh, примененная к одному и тому же значению, всегда будет выдавать один и тот же результат. UUID, с другой стороны, - это просто 128-битное целое число , поэтому просто примените 128-битную га sh функцию и интерпретируйте результат как UUID. Например, MD5 является такой функцией ha sh.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...