您能否帮助我实现以下目标:
考虑一个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应该没什么。由于没有匹配的密钥对。
答案 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()
以
的形式映射给定键的计数器变量以及现有列表值[(密钥,(值,计数器))]:
ex:[((1,2),([2,3,4,5,6,7,8,9,10,11,12,13,14],1))]
使用reduceByKey实现交叉操作并递增计数器
过滤并发布计数器值> 1