将 UUID 添加到 spark 数据集

Add UUID to spark dataset

我正在尝试将 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 function rand 生成一个列并使用 UUID.nameUUIDFromBytes 将其转换为 UUID。

最初,我有:

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

@irbull 指出的可能是个问题。