Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过键列将RDD[Rating]与scala.collection.Map[Int,Double]连接起来?_Scala_Apache Spark_Dictionary_Rdd - Fatal编程技术网

如何通过键列将RDD[Rating]与scala.collection.Map[Int,Double]连接起来?

如何通过键列将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),让我们将它们重命名为

我有两张桌子->

表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),让我们将它们重命名为
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|
+---+----+-----+
希望这能有所帮助