Pyspark - 查找键值对的交集

时间:2016-02-17 03:08:03

标签: python apache-spark pyspark rdd

您能否帮助我实现以下目标:

考虑一个i / p,它是键值对的列表,其中key是a(元组),value是[list]。如果i / p中存在两个相同的键,那么值应为。相交。如果您没有找到另一个密钥对,则应在o / p中忽略该密钥。

示例:

>>> data = [((1, 2), [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]), ((1, 2), [1, 3, 4, 5, 6, 7, 10, 11])]
>>> rdd = sc.parallelize(data)
>>> rdd.reduceByKey(lambda x,y : list(set(x).intersection(y))).collect()

o / p:[((1, 2), [3, 4, 5, 6, 7, 10, 11])]

由于存在两次相同的键,因此值相交。

>>> data = [((1, 2), [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]), ((1, 3), [1, 3, 4, 5, 6, 7, 10, 11])]
>>> rdd = sc.parallelize(data)
>>> rdd.reduceByKey(lambda x,y : list(set(x).intersection(y))).collect()

我得到了:[((1, 2), [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]), ((1, 3), [1, 3, 4, 5, 6, 7, 10, 11])]

预期结果:o / p应该没什么。由于没有匹配的密钥对。

1 个答案:

答案 0 :(得分:1)

我实现了如下逻辑

datardd.map(lambda x:(x[0],(x[1],1))).reduceByKey(lambda x,y:(set(x[0]).intersection(y[0]),x[1]+y[1])).filter(lambda x:x[1][1]>1).map(lambda x:(x[0],list(x[1][0]))).collect()
  1. 的形式映射给定键的计数器变量以及现有列表值

    [(密钥,(值,计数器))]:

    ex:[((1,2),([2,3,4,5,6,7,8,9,10,11,12,13,14],1))]

  2. 使用reduceByKey实现交叉操作并递增计数器

  3. 过滤并发布计数器值> 1

  4. 的值