在显示、计数和保存数据帧之间重新计算非确定性字段
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
,或 show
或 write
中的每一个都以 不同的 [= 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 中
我们有一个 uuid
udf
:
import java.util.UUID
val idUdf = udf(() => idgen.incrementAndGet.toString + "_" + UUID.randomUUID)
spark.udf.register("idgen", idUdf)
面临的一个问题是,当 运行 count
,或 show
或 write
中的每一个都以 不同的 [= 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 中