将UUID添加到Spark数据集

Use*_*Adi 3 apache-spark spark-csv apache-spark-dataset

我正在尝试将UUID列添加到我的数据集中。

getDataset(Transaction.class)).withColumn("uniqueId", functions.lit(UUID.randomUUID().toString())).show(false);
Run Code Online (Sandbox Code Playgroud)

但是结果是所有行都具有相同的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|
----------+----------------+--------+
Run Code Online (Sandbox Code Playgroud)

Ben*_*nns 8

当您将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);
Run Code Online (Sandbox Code Playgroud)

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

  • @irbull 那么在将行附加到数据帧时生成新的唯一 id 的好方法是什么?`monotically_increasing_id` + `最后存储的 monotonically_increasing_id`? (3认同)
  • 该解决方案有两个问题。1.不保证UUID.randomUUID()在节点之间是唯一的。它使用伪随机数,这在单台计算机上很好,但是在群集环境中,可能会发生冲突。2. UDF应该是确定性的。也就是说,对于相同的输入,您将获得相同的输出(spark保留缓存,重用结果等的权利),或者,如果选择,则多次调用相同的方法。/sf/ask/3007264431/ (2认同)
  • 很棒的观点@irbull - 我会更新以反映。 (2认同)