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

У нас есть uuidudf:

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, Существуют ли другие механизмы для достижения стабильности для этих столбцов уникальных идентификаторов?

1 ответ

Решение

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

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

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

Другие вопросы по тегам