Недетерминированные поля пересчитываются между показом, подсчетом и сохранением кадра данных
У нас есть 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
, Существуют ли другие механизмы для достижения стабильности для этих столбцов уникальных идентификаторов?
1 ответ
Решение
Просто определите свой udf как недетерминированный, вызвав:
val idUdf = udf(() => idgen.incrementAndGet.toString + "_" + UUID.randomUUID)
.asNondeterministic()
Это оценит ваш udf только один раз и сохранит результат в RDD