Spark:具有不同密钥类型的RDD中的密钥交集

时间:2017-01-13 22:55:55

标签: apache-spark dataframe set dataset rdd

考虑以下情况,您有两个键值对的RDD,其中来自两个RDD的两个键中的每一个都是不同类型的。

RDD1(Vector [String],String)如下所示:

(Vector("A", "B", "E"), "bla bla bla"),
(Vector("W"), "bla bla bla bla"),
(Vector("C", "M"), "bla bla bla bla bla"),
(Vector("A", "V"), "bla bla bla")
...


RDD2 [(String,String)]如下所示:

("A", 12),
("B", 434),
("C", 8023),
("D", 3454),
...
("N", 251)

注意:RDD2中的键来自A-N(包括A-N)。

所需的输出是第一个RDD1的对,这样Vector键中的每个字符串都是RDD2的整个键集的子集

(Vector("A", "E", "B"), "bla bla bla"),
(Vector("C", "M"), "bla bla bla bla bla")


如果RDD无法做到这一点,我想知道像dataframe和dataset这样的其他抽象如何实现这个结果

1 个答案:

答案 0 :(得分:0)

def myFilter(rdd1: RDD[(Vector[String],String)], rdd2: RDD[(String,String)]): RDD[(Vector[String],String)] = {

    val keys = rdd2.map(_._1).collect()

    val filtered = rdd1.filter{ entry =>
      entry._1.forall(str => keys.contains(str))
    }
    filtered
}

这不是完成任务的最有效方法,但可以完成工作。