我正在尝试向我的数据集添加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指出这可能是一个问题。