gpt4 book ai didi

scala - Spark Dataframe 随机 UUID 在每次转换/操作后发生变化

转载 作者:行者123 更新时间:2023-12-02 05:29:57 25 4
gpt4 key购买 nike

我有一个 Spark 数据框,其中有一列包含生成的 UUID。但是,每次我对数据框执行操作或转换时,它都会在每个阶段更改 UUID。

如何仅生成一次 UUID 并让 UUID 在此后保持静态。

下面是一些重现我的问题的示例代码:

def process(spark: SparkSession): Unit = {

import spark.implicits._

val sc = spark.sparkContext
val sqlContext = spark.sqlContext
sc.setLogLevel("OFF")

// create dataframe
val df = spark.createDataset(Array(("a", "1"), ("b", "2"), ("c", "3"))).toDF("col1", "col2")
df.createOrReplaceTempView("df")
df.show(false)

// register an UDF that creates a random UUID
val generateUUID = udf(() => UUID.randomUUID().toString)

// generate UUID for new column
val dfWithUuid = df.withColumn("new_uuid", generateUUID())
dfWithUuid.show(false)
dfWithUuid.show(false) // uuid is different

// new transformations also change the uuid
val dfWithUuidWithNewCol = dfWithUuid.withColumn("col3", df.col("col2")+1)
dfWithUuidWithNewCol.show(false)
}

输出为:

+----+----+
|col1|col2|
+----+----+
|a |1 |
|b |2 |
|c |3 |
+----+----+

+----+----+------------------------------------+
|col1|col2|new_uuid |
+----+----+------------------------------------+
|a |1 |a414e73b-24b8-4f64-8d21-f0bc56d3d290|
|b |2 |f37935e5-0bfc-4863-b6dc-897662307e0a|
|c |3 |e3aaf655-5a48-45fb-8ab5-22f78cdeaf26|
+----+----+------------------------------------+

+----+----+------------------------------------+
|col1|col2|new_uuid |
+----+----+------------------------------------+
|a |1 |1c6597bf-f257-4e5f-be81-34a0efa0f6be|
|b |2 |6efe4453-29a8-4b7f-9fa1-7982d2670bd6|
|c |3 |2f7ddc1c-3e8c-4118-8e2c-8a6f526bee7e|
+----+----+------------------------------------+

+----+----+------------------------------------+----+
|col1|col2|new_uuid |col3|
+----+----+------------------------------------+----+
|a |1 |00b85af8-711e-4b59-82e1-8d8e59d4c512|2.0 |
|b |2 |94c3f2c6-9234-4fb3-b1c4-273a37171131|3.0 |
|c |3 |1059fff2-b8f9-4cec-907d-ea181d5003a2|4.0 |
+----+----+------------------------------------+----+

请注意,每个步骤的 UUID 都不同。

最佳答案

这是预期的行为。用户定义函数have to be deterministic :

The user-defined functions must be deterministic. Due to optimization, duplicate invocations may be eliminated or the function may even be invoked more times than it is present in the query.

如果您想包含非确定性函数并保留输出,您应该将中间数据写入持久存储并将其读回。检查点或缓存可能在某些简单情况下有效,但通常可靠。

如果上游进程是确定性的(对于初学者来说有随机播放),您可以尝试使用 rand function with seed ,转换为字节数组并传递给 UUID.nameUUIDFromBytes

另请参阅:About how to add a new column to an existing DataFrame with random values in Scala

注意:SPARK-20586引入了确定性标志,该标志可以禁用某些优化,但尚不清楚当数据被持久化并且发生执行器丢失时它的行为如何。

关于scala - Spark Dataframe 随机 UUID 在每次转换/操作后发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42960920/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com