scala,过滤器RDD

scala,过滤器RDD,scala,apache-spark,rdd,Scala,Apache Spark,Rdd,我有: val key: RDD[String]= Seq("0000005","0000001","0000007").toRDD 及 val file2:Array[String]=数组(((“0000005”,82,79,16,21,80), ("0000001", 46, 39, 8, 5, 21), ("0000004", 58, 71, 20, 10, 6), ("0000009", 60, 89 33 18 6), ("0000003", 30, 50, 71, 36, 30)

我有:

val key: RDD[String]= Seq("0000005","0000001","0000007").toRDD

val file2:Array[String]=数组(((“0000005”,82,79,16,21,80), ("0000001", 46, 39, 8, 5, 21), ("0000004", 58, 71, 20, 10, 6), ("0000009", 60, 89 33 18 6), ("0000003", 30, 50, 71, 36, 30), ("0000007", 50, 2, 33, 15, 62)) 我想筛选“key”中的file2 exists元素

我想要这样的东西:

0000005 82 79 16 21 80 0000001 46 39 8 5 21 0000007 50 2 33 15 62 0000005 82 79 16 21 80 0000001 46 39 8 5 21 0000007 50 2 33 15 62
我将其简化为标准的
Scala
集合类型:

val keys = Seq("0000005","0000001","0000007")

val all = Seq("0000005 82 79 16 21 80",
"0000001 46 39 8 5 21", 
"0000004 58 71 20 10 6",
"0000009 60 89 33 18 6",
"0000003 30 50 71 36 30",
"0000007 50 2 33 15 62")
以下是将为您提供resuklt的筛选函数:

val filtered = all.map(_.split(" ").toList)
                  .filter{ case x::_ => keys.contains(x) }
                  .map(_.mkString(" "))

println(filtered) // -> List(0000005 82 79 16 21 80, 0000001 46 39 8 5 21, 0000007 50 2 33 15 62)

请参见

我将其简化为标准的
Scala
集合类型:

val keys = Seq("0000005","0000001","0000007")

val all = Seq("0000005 82 79 16 21 80",
"0000001 46 39 8 5 21", 
"0000004 58 71 20 10 6",
"0000009 60 89 33 18 6",
"0000003 30 50 71 36 30",
"0000007 50 2 33 15 62")
以下是将为您提供resuklt的筛选函数:

val filtered = all.map(_.split(" ").toList)
                  .filter{ case x::_ => keys.contains(x) }
                  .map(_.mkString(" "))

println(filtered) // -> List(0000005 82 79 16 21 80, 0000001 46 39 8 5 21, 0000007 50 2 33 15 62)

首先请参见,需要映射键->值结构的
file2
(我假设file2中的所有数字实际上都是字符串..):

现在,如果您这样做: keys.join(file2Map).take(10).foreach(println)

输出类似于:

(0000005, (0000005, 0000005 82 79 16 21 80)
(0000001, (0000001, 0000001 46 39 8 5 21)
(0000007, (0000001, 0000001 50 2 33 15 62)

因此,很容易从值中只获取第二个元组。

首先,需要映射键->值结构的
file2
:(我假设file2中的所有数字实际上都是字符串..):

现在,如果您这样做: keys.join(file2Map).take(10).foreach(println)

输出类似于:

(0000005, (0000005, 0000005 82 79 16 21 80)
(0000001, (0000001, 0000001 46 39 8 5 21)
(0000007, (0000001, 0000001 50 2 33 15 62)

因此,很容易从该值中仅获取第二个元组。

如果文件足够小,则可以将其转换为
数组
,并且可以使用此解决方案。但是,如果OP想要使用
RDD
s
keys.contains(x)
将不起作用。此答案使用Seq(List)contains方法,该方法进行线性查找。此解决方案无法很好地扩展如果文件足够小,它们可以转换为
数组
,并且可以使用此解决方案。但是,如果OP想要使用
RDD
s
keys.contains(x)
将不起作用。此答案使用Seq(List)contains方法,该方法进行线性查找。这个解决方案不能很好地扩展