我们有一个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
的配置和维护,这当然是昂贵的。是否有其他机制可以实现这些唯一ID列的稳定性?
只需通过调用将您的udf定义为不确定性
val idUdf = udf(() => idgen.incrementAndGet.toString + "_" + UUID.randomUUID)
.asNondeterministic()
这将只评估您的udf一次,并将结果保存在RDD 中