在Spark scala中比较来自公共密钥的紧凑缓冲区上的两个Iterable字符串

在Spark scala中比较来自公共密钥的紧凑缓冲区上的两个Iterable字符串,scala,apache-spark,apache-spark-sql,spark-streaming,rdd,Scala,Apache Spark,Apache Spark Sql,Spark Streaming,Rdd,我将两个RDD组合在一起,并且我必须在结果RDD的紧凑缓冲区中比较Iterable字符串,比较是这样的 1)如果右compactbuffer值为空,则保留左compactbuffer值 2) 如果左compactbuffer值缓冲区为空,则仅当右缓冲区中有“I”时才保留右缓冲区 3) 如果左边的compactbuffer值不为空,右边的compactbuffer值也不为空,在这种情况下使用右边的buffer 4) 如果左compactbuffer值不为空,右compactbuffer值也不为空,

我将两个RDD组合在一起,并且我必须在结果RDD的紧凑缓冲区中比较Iterable字符串,比较是这样的

1)如果右compactbuffer值为空,则保留左compactbuffer值

2) 如果左compactbuffer值缓冲区为空,则仅当右缓冲区中有“I”时才保留右缓冲区

3) 如果左边的compactbuffer值不为空,右边的compactbuffer值也不为空,在这种情况下使用右边的buffer

4) 如果左compactbuffer值不为空,右compactbuffer值也不为空,且右缓冲区中没有“I”,则丢弃值,并从rdd中删除整个条目

输入:

res4: org.apache.spark.rdd.RDD[(String, (Iterable[String], Iterable[String]))] = MapPartitionsRDD[25] at cogroup at <console>:57

Array[(String, (Iterable[String], Iterable[String]))] = 
Array((6,(CompactBuffer(6,surya,1003,null),CompactBuffer(6,surya,1030,D))), 

(5,(CompactBuffer(5,karun,1007,null),CompactBuffer(5,nirav,1023,I))), 

(9,(CompactBuffer(9,pranav,1010,null),CompactBuffer())), 

(3,(CompactBuffer(3,riahana,1006,null),CompactBuffer(3,rohit,1020,I))),

(1,(CompactBuffer(1,shubham,1001,null),CompactBuffer(1,yuvraj,1070,I))))

我不确定我是否理解,但希望这能给你一个想法:

val result: RDD[(String, Iterable[String])] = data
        .filter(_._2._2.exists(_.endsWith("I")))
        .mapValues {
          case (left, right) => (left, right.filter(_.endsWith("I")))
        }.mapValues {
          case (left, right) => right.headOption.map(_ => right).getOrElse(left)
        }

或者你可以做一个简单的
对。如果你愿意,我可以用
if
/
else
检查一下。

你试过什么吗?是的@AlbertoBonsanto我试过了,但我没能拿出正确的输出。我是新来的火花:(如果两者都不是空的,并且左右两边都没有字母
l
,会发生什么?@Albertobonsan要离开这种情况,你的离开是什么意思?当右缓冲区中没有“I”时,你的解决方案也会给我左缓冲区值。如何丢弃该值?它也给了我这个值6,surya,1003,null数组((6,CompactBuffer(6,surya,1003,null)),(5,列表(5,nirav,1023,I)),(9,CompactBuffer(9,pranav,1010,null)),(3,列表(3,rohit,1020,I)),(1,列表(1,yuvraj,1070,I)))正如@AlbertoBonsanto多次告诉您的,您的需求仍然不明确——在这种情况下,当两个
Iterable
s都是非空的,而右边没有I时会发生什么。无论如何,目标是为您提供您自己解决问题所需的信息——而不是为您完成所有工作。如果我的需求不明确,我很抱歉请注意,这是我关于stackoverflow的第一个问题,基本上当两个Iterables都不为空且右边没有I时,在这种情况下,我们将不会从双方获取任何值。感谢@Vidya指出我的错误,我以后会小心的,非常感谢您提供的解决方案,您是最好的:)所以当您说“什么也不拿”时你的意思是一个空的
Iterable
?你的意思是
RDD
中的整个条目都消失了吗?精确地定义它。是的,结果RDD中的整个条目都应该消失。
val result: RDD[(String, Iterable[String])] = data
        .filter(_._2._2.exists(_.endsWith("I")))
        .mapValues {
          case (left, right) => (left, right.filter(_.endsWith("I")))
        }.mapValues {
          case (left, right) => right.headOption.map(_ => right).getOrElse(left)
        }