数据处理生产环境_利用MurmurHash3算法在Spark和Scala中生成随机颜色
需求
根据给定的轨迹编号在这一列后面生成随机颜色_16
输入数据
("吃饭", "123"),
("吃饭", "宋江"),
("郭靖", "宋江"),
("杨过", "奥特曼"),
("周芷若", "张无忌"),
("石破天", "谢逊"),
("赵敏", "张三丰"),
("小龙女", "杨过"),
("黄蓉", "郭靖"),
("洪七公", "欧阳锋")
Spark代码
package test
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._
import scala.util.hashing.MurmurHash3
object randomV2 {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder()
.appName("ColorGeneration")
.master("local[*]")
.getOrCreate()
import spark.implicits._
// 创建DataFrame使用提供的数据,这里是测试数据,
//生产环境中我们一般是读取的上一个节点传来的dataframe,直接调下面的方法,自定义函数即可,
//完全可以实现我们想要的功能,可根据我们的具体虚修再做修改
//val df = spark.read.csv("xxx.csv", header = true, inferSchema = true),
//20231117lxh
//https://blog.csdn.net/qq_52128187?type=blog
val data = Seq(
("吃饭", "123"),
("吃饭", "宋江"),
("郭靖", "宋江"),
("杨过", "奥特曼"),
("周芷若", "张无忌"),
("石破天", "谢逊"),
("赵敏", "张三丰"),
("小龙女", "杨过"),
("黄蓉", "郭靖"),
("洪七公", "欧阳锋")
)
val df1 = data.toDF("a1", "a2")
// 定义基于种子的随机颜色生成函数
def getRandomColorFromSeed(seed: String): String = {
val hashed = MurmurHash3.stringHash(seed) // 使用MurmurHash3生成种子的哈希值
//https://blog.csdn.net/qq_52128187?type=blog
val r = (hashed & 0xFF0000) >> 16
val g = (hashed & 0x00FF00) >> 8
val b = hashed & 0x0000FF
f"#$r%02x$g%02x$b%02x"
}
val getRandomColorWithSeedUDF = udf((seed: String) => getRandomColorFromSeed(seed))
val dfWithColor = df1.withColumn("c1", getRandomColorWithSeedUDF($"a1"))
dfWithColor.show() // 显示包含使用相同随机种子生成的新 "c1" 列的 DataFrame //20231117lxh
}
}
输出结果:
+----+-------+------+
| a1| a2| c1|
+----+-------+------+
|吃饭| 123|#ff5e52|
|吃饭| 宋江|#cfac7d|
|郭靖| 宋江|#e0e0e0|
|杨过|奥特曼|#ff5e52|
|周芷若|张无忌|#ffb961|
|石破天| 谢逊|#1c6a77|
|赵敏|张三丰|#ff89a7|
|小龙女| 杨过|#ff5e52|
|黄蓉| 郭靖|#e0e0e0|
|洪七公| 欧阳锋|#1298d5|
+----+-------+------+
这是其中一版,能基本实现我生产中的需求,还有第二版回头再补充吧