Scala 替换RDD的某些元素

Scala 替换RDD的某些元素,scala,apache-spark,rdd,Scala,Apache Spark,Rdd,我有一个文件,它包含三种类型的数据,比如A、B、C。我只想根据某些条件,用其他RDD的元素(称为RDD2)替换这个RDD的类型A元素(称为RDD1)。RDD1和RDD2有一些共同的字符串 文件结构[RDD[String]] 1 A 2 2 B 12 13 4 2 C 67 29 2 A 5 RDD2[RDD[行]] 1 A 2 5 6 2 A 5 7 8 我正在过滤第一个RDD并向其添加一些字符串以创建RDD2 我知道RDD是不可变的,但由于映射函数不带参数。我想知道是否有办法实

我有一个文件,它包含三种类型的数据,比如A、B、C。我只想根据某些条件,用其他RDD的元素(称为RDD2)替换这个RDD的类型A元素(称为RDD1)。RDD1和RDD2有一些共同的字符串

文件结构[RDD[String]]

1 A 2   
2 B 12 13 4
2 C 67 29  
2 A 5
RDD2[RDD[行]]

1 A 2 5 6
2 A 5 7 8 
我正在过滤第一个RDD并向其添加一些字符串以创建RDD2

我知道RDD是不可变的,但由于映射函数不带参数。我想知道是否有办法实现这一点

编辑:(考虑以下评论)

样本输出RDD[任何]

1 A 2 5 6
2 B 12 13 4
2 C 67 29
2 A 5 7 8
它对我有用

val rdd1 = sc.parallelize(Seq(List("1", "A", "2"), List("2", "B", "12", "13", "4"), List("2", "C", "67", "29"), List("2", "A", "5")))
val rdd2 = sc.parallelize(Seq(List("1", "A", "2", "5", "6"), List("2", "A", "5", "7", "8")))
rdd1.map(row =>//where row(0), row(1) is your condition
  ((row(0), row(1)), row)).leftOuterJoin(rdd2.map(row =>
  ((row(0), row(1)), row))).map(row => {
  row._2._2.getOrElse(row._2._1)
}).foreach(println)
它对我有用

val rdd1 = sc.parallelize(Seq(List("1", "A", "2"), List("2", "B", "12", "13", "4"), List("2", "C", "67", "29"), List("2", "A", "5")))
val rdd2 = sc.parallelize(Seq(List("1", "A", "2", "5", "6"), List("2", "A", "5", "7", "8")))
rdd1.map(row =>//where row(0), row(1) is your condition
  ((row(0), row(1)), row)).leftOuterJoin(rdd2.map(row =>
  ((row(0), row(1)), row))).map(row => {
  row._2._2.getOrElse(row._2._1)
}).foreach(println)

<>你应该考虑在RDDS内部使用一个更合适和明确的数据结构,比如RDD(key,value)对。p> 然后,您可以利用该键在RDD1和RDD2“alaSQL”之间执行连接。我相信这是上面已经在做的事情,但是使用了Scala语法糖的全部功能

以更明确的方式: 您的初始RDD,如中所示:

然后使用映射创建一个(键、值)对的RDD,其中键将用于满足您的匹配条件(在您的示例中,您的键似乎是前两个元素,例如(1,a))

现在,由于您希望对键为“A”的值执行“连接”,而其他值不匹配,因此这是一个SQL左外部连接。因此:

val resultRaw = rdd1KeyValue.leftOuterJoin(rdd2KeyValue)
但resultRaw现在有点像:

((2,C),(List(2, C, 67, 29),None))
((1,A),(List(1, A, 2),Some(List(1, A, 2, 5, 6))))
((2,B),(List(2, B, 12, 13, 4),None))
((2,A),(List(2, A, 5),Some(List(2, A, 5, 7, 8))))
因此,要获取最终结果,需要再次映射以“拾取”所需内容(1运算符是获取(键,值)对的第一个值):

就我而言,最终结果是:

List(1, A, 2, 5, 6)
List(2, B, 12, 13, 4)
List(2, A, 5, 7, 8)
List(2, C, 67, 29)

<>你应该考虑在RDDS内部使用一个更合适和明确的数据结构,比如RDD(key,value)对。p> 然后,您可以利用该键在RDD1和RDD2“alaSQL”之间执行连接。我相信这是上面已经在做的事情,但是使用了Scala语法糖的全部功能

以更明确的方式: 您的初始RDD,如中所示:

然后使用映射创建一个(键、值)对的RDD,其中键将用于满足您的匹配条件(在您的示例中,您的键似乎是前两个元素,例如(1,a))

现在,由于您希望对键为“A”的值执行“连接”,而其他值不匹配,因此这是一个SQL左外部连接。因此:

val resultRaw = rdd1KeyValue.leftOuterJoin(rdd2KeyValue)
但resultRaw现在有点像:

((2,C),(List(2, C, 67, 29),None))
((1,A),(List(1, A, 2),Some(List(1, A, 2, 5, 6))))
((2,B),(List(2, B, 12, 13, 4),None))
((2,A),(List(2, A, 5),Some(List(2, A, 5, 7, 8))))
因此,要获取最终结果,需要再次映射以“拾取”所需内容(1运算符是获取(键,值)对的第一个值):

就我而言,最终结果是:

List(1, A, 2, 5, 6)
List(2, B, 12, 13, 4)
List(2, A, 5, 7, 8)
List(2, C, 67, 29)

你能给出这个示例输出吗?@MukrramRahman'1a256''2b1214''2c6729''2a578'你的RDD是什么类型的,我的意思是RDD[Row]还是RDD[String]或其他什么?RDD1是RDD[String]类型,RDD2是RDD[Row]类型我想将输出的RDD导出到文本文件中。我想这可以在我们得到最终的RDD(任何类型)后完成。现在我能想到的唯一解决方案是对RDD2和RDD3执行联合操作(过滤掉B和C类型)。你能给出这个的示例输出吗?@MukrramRahman'1a256''2b12134''2c6729''2a578'你的RDD是什么类型的,我的意思是它是RDD[Row]还是RDD[String]还是别的什么?RDD1是RDD[String]类型,RDD2是RDD[Row]类型我想把输出的RDD导出到文本文件中。我想这可以在我们得到最终的RDD(任何类型)后完成。现在我能想到的唯一解决方案是对RDD2和RDD3执行联合操作(过滤掉B和C类型)。