如何通过键列将RDD[Rating]与scala.collection.Map[Int,Double]连接起来?
我有两张桌子-> 表1:RDD[评级](rdd1、rdd2、rdd3) 及 表2:scala.collection.Map[Int,Double](m1,m2) 我花了大量的时间和精力,试图使连接表成为 (键(键=rdd2=m1),rdd3,m2) 但我总是有一个类型不匹配如何通过键列将RDD[Rating]与scala.collection.Map[Int,Double]连接起来?,scala,apache-spark,dictionary,rdd,Scala,Apache Spark,Dictionary,Rdd,我有两张桌子-> 表1:RDD[评级](rdd1、rdd2、rdd3) 及 表2:scala.collection.Map[Int,Double](m1,m2) 我花了大量的时间和精力,试图使连接表成为 (键(键=rdd2=m1),rdd3,m2) 但我总是有一个类型不匹配 你能给我一个如何处理的建议吗?我也尝试将这两个表转换为一种类型,但我肯定这不是正确的方法…基于您有一个RDD和一个Map,您可以直接迭代RDD 假设Rating有3个字段(rdd1、rdd2、rdd3),让我们将它们重命名为
你能给我一个如何处理的建议吗?我也尝试将这两个表转换为一种类型,但我肯定这不是正确的方法…基于您有一个
RDD
和一个Map
,您可以直接迭代RDD
假设Rating
有3个字段(rdd1、rdd2、rdd3),让我们将它们重命名为field1
、field2
和field3
,以使示例更清晰,避免混淆
给出此示例输入源:
case class Rating(field1: String, field2: Int, field3: String) // custom case class
val yourRDD = spark.sparkContext.parallelize(
Seq(
Rating("rating1", 1, "str1"), // item 1
Rating("rating2", 2, "str2"), // item 2
Rating("rating3", 3, "str3") // item 3
)
)
yourRDD.toDF.show() // to visualize()
这将输出您的数据源,如下所示:
+-------+------+------+
| field1|field2|field3|
+-------+------+------+
|rating1| 1| str1|
|rating2| 2| str2|
|rating3| 3| str3|
+-------+------+------+
同样,您的地图也有以下示例数据:
val yourMap = Map(
1 -> 1.111,
2 -> 2.222,
3 -> 3.333
)
println(yourMap)
yourMap: scala.collection.immutable.Map[Int,Double] = Map(1 -> 1.111, 2 -> 2.222, 3 -> 3.333)
地图上的数据:
val yourMap = Map(
1 -> 1.111,
2 -> 2.222,
3 -> 3.333
)
println(yourMap)
yourMap: scala.collection.immutable.Map[Int,Double] = Map(1 -> 1.111, 2 -> 2.222, 3 -> 3.333)
然后,要“合并”,您只需迭代RDD
,获取要用作键的值,在本例中为字段2
,并将其用作映射的键。大概是这样的:
yourRDD
.map(rating=>{ // iterate each item in your RDD
val key = rating.field2 // get the value from the current item
val valueFromMap = yourMap(key) // look for the value on the map using field2 as key - You need to handle null values in case that you wont have values for all the keys
(key, rating.field3, valueFromMap) // generating an output for a new RDD that will be created based on this
}).toDF.show(truncate=false) // visualize the output
上述代码将输出:
+---+----+-----+
|_1 |_2 |_3 |
+---+----+-----+
|1 |str1|1.111|
|2 |str2|2.222|
|3 |str3|3.333|
+---+----+-----+
希望这能有所帮助