Spark(Scala)中如何更新DataFrame的id列值?
Spark(Scala)中如何更新DataFrame的id列值?
嘿,我来帮你搞定这个问题!你之前的写法没达到预期效果,核心原因是Random.nextString(10)是Scala本地的随机方法——它只会在Driver端执行一次,生成一个固定的随机字符串,然后给所有行的id都加上同一个串,自然不是你想要的每行都有不同随机值的效果啦。
下面给你两种实用的解决方案,都适配Spark 2.x及以上版本:
方案一:用Spark内置函数生成唯一随机后缀
如果只是需要给原id加一段唯一的随机字符串,用Spark自带的uuid()函数就很方便,它能生成全局唯一的UUID字符串,我们可以截取前10位来满足长度需求:
import org.apache.spark.sql.functions.{concat, col, substring, uuid} // 拼接原id和10位长度的随机UUID后缀 val updatedDf = dfWithSchema.withColumn("id", concat(col("id"), substring(uuid(), 1, 10)))
方案二:自定义UDF生成指定长度的随机字符串
如果需要更灵活控制随机字符串的内容或长度,自定义UDF是更好的选择,它会在Executor端执行,每行都会生成独立的随机串:
import org.apache.spark.sql.functions.{udf, lit} import scala.util.Random // 定义生成指定长度随机字符串的UDF val generateRandomString = udf((length: Int) => Random.nextString(length)) // 更新id列,这里是拼接原id和10位随机串,要是想直接替换就去掉concat部分 val updatedDf = dfWithSchema.withColumn("id", concat(col("id"), generateRandomString(lit(10))))
要是你想直接替换整个id列而不是拼接,只需要把concat(col("id"), ...)换成generateRandomString(lit(10))或者uuid()就行啦!
备注:内容来源于stack exchange,提问作者Jelly
相关产品推荐
相关产品推荐

