计数和保存数据帧之间重新计算非确定性字段
我们有一个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中