使用列值列表收集多个RDD-Spark

时间:2019-09-05 01:29:36

标签: scala apache-spark apache-spark-sql

我有一个RDD和一个值列表。如何根据值列表过滤它们并将其收集为单独的RDD?

例如:

val rdd = sc.parallelize(Seq((4, "blah", 2), (2, "", 3), (56, "foo", 3), (100, null, 5)))

如何传递值列表以将所有已过滤的RDD收集到列表中?例如,对于列表:

val l = List(2,3)

干杯!

2 个答案:

答案 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]