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