我正在尝试将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|
----------+----------------+--------+
答案 0 :(得分:5)
当您将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指出的可能是一个问题。