Я хочу иметь столбец 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)]