Рассчитать UDF один раз - PullRequest
       80

Рассчитать UDF один раз

0 голосов
/ 21 января 2020

Я хочу иметь столбец UUID в кадре данных pyspark, который рассчитывается только один раз, чтобы я мог выбрать столбец в другом кадре данных и иметь идентичные идентификаторы UUID. Однако UDF для столбца UUID пересчитывается при выборе столбца.

Вот что я пытаюсь сделать:

>>> uuid_udf = udf(lambda: str(uuid.uuid4()), StringType())
>>> a = spark.createDataFrame([[1, 2]], ['col1', 'col2'])
>>> a = a.withColumn('id', uuid_udf())
>>> a.collect()
[Row(col1=1, col2=2, id='5ac8f818-e2d8-4c50-bae2-0ced7d72ef4f')]
>>> b = a.select('id')
>>> b.collect()
[Row(id='12ec9913-21e1-47bd-9c59-6ddbe2365247')]  # Wanted this to be the same ID as above

Возможный обходной путь: rand ()

Возможным обходным путем может быть использование pyspark. sql .functions.rand () в качестве моего источника случайности. Однако есть две проблемы:

1) Я хотел бы, чтобы в UUID были буквы, а не только цифры, чтобы он не был таким длинным

2 ) Хотя это технически работает, но выдает ужасные UUID:

>>> from pyspark.sql.functions import rand, round
>>> a = a.withColumn('id', round(rand() * 10e16))
>>> a.collect()
[Row(col1=1, col2=2, id=7.34745165108606e+16)]

Ответы [ 2 ]

2 голосов
/ 21 января 2020

Используйте вместо Spark встроенную функцию uuid:

a = a.withColumn('id', expr("uuid()"))
b = a.select('id')

b.collect()
[Row(id='da301bea-4927-4b6b-a1cf-518dea8705c4')]

a.collect()
[Row(col1=1, col2=2, id='da301bea-4927-4b6b-a1cf-518dea8705c4')]
2 голосов
/ 21 января 2020

Причина, по которой ваш UUID постоянно меняется, заключается в том, что ваш кадр данных вычисляется снова и снова после каждого действия.

Чтобы стабилизировать свой результат, вы можете просто использовать persist или cache (в зависимости от размера вашего фрейма данных).

df.persist()

df.show()                                                                                          
+---+--------------------+
| id|                uuid|
+---+--------------------+
|  0|e3db115b-6b6a-424...|
+---+--------------------+


b = df.select("uuid")                                                                              

b.show()                                                                                           
+--------------------+
|                uuid|
+--------------------+
|e3db115b-6b6a-424...|
+--------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...