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

Non deterministic fields getting recalculated between showing, counting, and saving a dataframe

我们有一个 uuid udf :

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

面临的一个问题是,当 运行 count,或 showwrite 中的每一个都以 不同的 [= udf 结果的 29=] 值。

    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 结果?第一个想法是使用每列中其他 stable 字段的一些独特组合来调用远程 Key-Value 存储。由于每行查找以及远程配置和维护 KV Store,这当然很昂贵。是否有其他机制来实现这些唯一 ID 列的稳定性?

只需通过调用将您的 udf 定义为不确定的:

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

这将只评估你的 udf 一次并将结果保存在 RDD 中