我有一个RDD和一个值列表。如何根据值列表过滤它们并将其收集为单独的RDD?
例如:
val rdd = sc.parallelize(Seq((4, "blah", 2), (2, "", 3), (56, "foo", 3), (100, null, 5)))
如何传递值列表以将所有已过滤的RDD收集到列表中?例如,对于列表:
val l = List(2,3)
干杯!
答案 0 :(得分:2)
如果您有DataFrame(根据修改前的问题),则可以使用方法isin
scala> df.filter($"C" isin (2,3)).show()
+---+----+---+
| A| B| C|
+---+----+---+
| 4|blah| 2|
| 2| | 3|
| 56| foo| 3|
+---+----+---+
对于RDD :是的,您有理由使用RDD,但是,如果您使用的是Spark 2.x
,则原因非常有限。
RDD是低级API。您的代码将如下所示。
scala> val rdd1 = rdd.filter(c=>List(2,3).contains(c._3))
rdd1: org.apache.spark.rdd.RDD[(Int, String, Int)] = MapPartitionsRDD[5] at filter at <console>:25
scala> rdd1.collect().foreach(println)
(4,blah,2)
(2,,3)
(56,foo,3)
答案 1 :(得分:2)
在大多数情况下,使用单个数据框而不是数据框列表会更容易。要使用值列表过滤数据框,请使用isin
,如Gaurang Shah的回答。
但是,如果您真的想要一个数据框列表,那么也可以。只需在列表上map
,然后按照以下步骤过滤数据框:
val dfs = l.map(x => df.filter($"C" === x))
dfs
将会是一个List[DataFrame]
。
对于RDD:
如果您使用RDD
,则唯一需要更改的是过滤器操作:
val rdds = l.map(x => rdd.filter(c => c._3 === x))
rdds
将是List[RDD]
。