将 UUID 添加到火花数据集



我正在尝试向我的数据集添加UUID列。

getDataset(Transaction.class)).withColumn("uniqueId", functions.lit(UUID.randomUUID().toString())).show(false);

但结果是所有行都具有相同的 UUID。如何让它独一无二?

+-----------------------------------+
uniqueId                            |
+----------------+-------+-----------
|1abdecf-8303-4a4e-8ad3-89c190957c3b|
|1abdecf-8303-4a4e-8ad3-89c190957c3b|
|1abdecf-8303-4a4e-8ad3-89c190957c3b|
|1abdecf-8303-4a4e-8ad3-89c190957c3b|
|1abdecf-8303-4a4e-8ad3-89c190957c3b|
|1abdecf-8303-4a4e-8ad3-89c190957c3b|
|1abdecf-8303-4a4e-8ad3-89c190957c3b|
|1abdecf-8303-4a4e-8ad3-89c190957c3b|
|1abdecf-8303-4a4e-8ad3-89c190957c3b|
|1abdecf-8303-4a4e-8ad3-89c190957c3b|
----------+----------------+--------+

更新(2021 年 4 月(:

根据@ferdyh,有一种更好的方法来使用Spark SQL中的uuid()函数。像expr("uuid()")这样的东西将使用Spark的本机UUID生成器,它应该更快,更干净。

最初(2018 年 6 月(:

将 UUID 作为lit列包含在内时,执行的操作与包含字符串文本相同。

需要为每一行生成 UUID。您可以使用 UDF 执行此操作,但这可能会导致问题,因为 UDF 应该是确定性的,并且期望它们的随机性可能会导致缓存或再生发生时出现问题。

最好的办法可能是生成一个带有 Spark 函数rand的列,并使用UUID.nameUUIDFromBytes将其转换为 UUID。

最初,我有:

val uuid = udf(() => java.util.UUID.randomUUID().toString)
getDataset(Transaction.class).withColumn("uniqueId", uuid()).show(false);

@irbull指出这可能是一个问题。

最新更新