将 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 指出的可能是个问题。
我正在尝试将 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 指出的可能是个问题。