在显示、计数和保存数据帧之间重新计算非确定性字段



我们有一个uuidudf:

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

面临的一个问题是,当运行countshowwrite时,它们中的每一个最终都会得到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 中

最新更新