Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.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
Java 使用Scala Apache Spark合并RDD_Java_Scala_Apache Spark - Fatal编程技术网

Java 使用Scala Apache Spark合并RDD

Java 使用Scala Apache Spark合并RDD,java,scala,apache-spark,Java,Scala,Apache Spark,我有两个RDD RDD1: ((String, String), Int) RDD2: (String, Int) 例如: RDD1 ((A, X), 1) ((B, X), 2) ((A, Y), 2) ((C, Y), 3) RDD2 (A, 6) (B, 7) (C, 8) Output Expected ((A, X), 6) ((B, X), 14) ((A, Y), 12)

我有两个RDD

RDD1: ((String, String), Int)
RDD2: (String, Int)
例如:

    RDD1

    ((A, X), 1)
    ((B, X), 2)
    ((A, Y), 2)
    ((C, Y), 3)

    RDD2

    (A, 6)
    (B, 7)
    (C, 8)

Output Expected

    ((A, X), 6)
    ((B, X), 14)
    ((A, Y), 12)
    ((C, Y), 24)
在RDD1中,(字符串,字符串)组合是唯一的,而在RDD2中,每个字符串键都是唯一的。 RDD2(6)中A的分数乘以RDD1中键中有A的条目的所有分数值

14 = 7 * 2
12 = 6 * 2
24 = 8 * 3
我写了以下内容,但在案例中给出了一个错误:

val finalRdd = countRdd.join(countfileRdd).map(case (k, (ls, rs)) => (k, (ls * rs)))

有人能帮我一下吗?

您的第一个RDD与第二个RDD的密钥类型不同(元组(A,X)与A)。您应该在加入之前对其进行转换:

val rdd1  = sc.parallelize(List((("A", "X"), 1), (("A", "Y"), 2)))
val rdd2 = sc.parallelize(List(("A", 6)))
val rdd1Transformed = rdd1.map { 
   case ((letter, coord), value) => (letter, (coord, value)) 
}
val result = rdd1Transformed
  .join(rdd2)
  .map { 
    case (letter, ((coord, v1), v2)) => ((letter, coord), v1 * v2) 
  }
result.collect()
res1: Array[((String, String), Int)] = Array(((A,X),6), ((A,Y),12))

我猜
(A,X),6
应该是
(A,X),12
符合您的逻辑,还是我遗漏了什么?它是6,因为RDD2中A的值是6,而RDD1中,(A,X)的值是1。所以它们相乘得到6。