6

我正在尝试向我的数据集添加一个 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|
----------+----------------+--------+
4

1 回答 1

9

当您将 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指出这可能是一个问题。

于 2018-04-09T15:03:44.487 回答