2016-08-18 22 views
1

所以我RDD由数据看起来像:创建与现有的键值列表的组合 - Pyspark

(k, [v1,v2,v3...]) 

我想创建一个价值部分的所有套二的组合。

所以最终图应该是这样的:

(k1, (v1,v2)) 
(k1, (v1,v3)) 
(k1, (v2,v3)) 

我知道得到的价值的一部分,我会使用类似

rdd.cartesian(rdd).filter(case (a,b) => a < b) 

然而,这需要传递整个RDD(对吧?)不只是价值的一部分。我不确定如何达到我想要的目的,我怀疑它是一个群体。

而且,最终,我想要得到的K,V看起来就像

((k1,v1,v2),1) 

我知道如何从我所期待的该得到的,但也许它更容易直来直去那里?

谢谢。

+0

欢迎使用计算器。请格式化您的问题,摆脱缩写,并[读这篇文档](http://stackoverflow.com/help/how-to-ask)。这会让你的问题对未来的读者有用。 –

回答

2

我认为以色列的答案是不完整的,所以我走了一步。

import itertools 

a = sc.parallelize([ 
    (1, [1,2,3,4]), 
    (2, [3,4,5,6]), 
    (3, [-1,2,3,4]) 
    ]) 

def combinations(row): 
    l = row[1] 
    k = row[0] 
    return [(k, v) for v in itertools.combinations(l, 2)] 

a.map(combinations).flatMap(lambda x: x).take(3) 
# [(1, (1, 2)), (1, (1, 3)), (1, (1, 4))] 
+0

是的,我确实必须自己将其平面图以将其转换为最终所需的格式 – tormond

1

使用itertools来创建组合。这里是一个演示:

import itertools 

k, v1, v2, v3 = 'k1 v1 v2 v3'.split() 

a = (k, [v1,v2,v3]) 

b = itertools.combinations(a[1], 2) 
data = [(k, pair) for pair in b] 

data将是:

[('k1', ('v1', 'v2')), ('k1', ('v1', 'v3')), ('k1', ('v2', 'v3'))] 
+0

因此,在pyspark中,我需要创建另一个功能来执行此操作?因为我不知道如何链接。我想过创建一个函数,然后导入它,看起来像这样。我不知道是否有一种原生的方式通过预建功能来完成。 – tormond

+0

您可以创建一个接收k和一个v列表的函数,并返回数据,如我的回答 –

+1

谢谢!得到这个工作和学习,我可以将一个函数粘贴到pyspark! – tormond