Недетерминированные поля пересчитываются между отображением, подсчетом и сохранением фрейма данных

У нас есть uuid udf :

import java.util.UUID
val idUdf = udf(() => idgen.incrementAndGet.toString + "_" + UUID.randomUUID)
spark.udf.register("idgen", idUdf)

Проблема заключается в том, что при запуске count, show или write каждый из них получает различное значение результата udf.

    df.count()             // generates a UUID for each row
    df.show()              // regenerates a UUID for each row
    df.write.parquet(path) // .. you get the picture ..

Какие подходы можно использовать для сохранения одного результата uuid для данной строки? Первой мыслью будет вызвать удаленное Key-Value хранилище, используя некоторую уникальную комбинацию других стабильных полей в каждом столбце. Это, конечно, дорого как из-за поиска для каждой строки, так и из-за конфигурации и обслуживания удаленного KV Store. Существуют ли другие механизмы для обеспечения стабильности этих уникальных столбцов идентификаторов?


person WestCoastProjects    schedule 16.12.2018    source источник


Ответы (1)


Просто определите свой udf как недетерминированный, вызвав:

val idUdf = udf(() => idgen.incrementAndGet.toString + "_" + UUID.randomUUID)
    .asNondeterministic()

Это оценит ваш udf только один раз и сохранит результат в RDD.

person Tom Lous    schedule 16.12.2018
comment
ну удачи в следующий раз. потратил пару часов на рефакторинг, чтобы сохранить RDD, а затем прочитал его как функциональный, но уродливый обходной путь - person WestCoastProjects; 16.12.2018
comment
Мы все там были :-) - person Tom Lous; 16.12.2018