创建值列表与现有密钥的组合 - Pyspark

时间:2016-08-18 19:52:45

标签: python apache-spark mapreduce pyspark

所以我的rdd包含如下数据:

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

我想为值部分创建所有两组的组合。

所以结束地图应如下所示:

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

我知道要获得价值部分,我会使用像

这样的东西
rdd.cartesian(rdd).filter(case (a,b) => a < b)

然而,这需要传递整个rdd(对吗?)而不仅仅是值部分。我不确定如何达到我想要的目的,我怀疑它是一个小组。

另外,最终,我想要k,看起来像

((k1,v1,v2),1)

我知道如何从我想要的东西中获得,但也许更容易直接去那里?

感谢。

3 个答案:

答案 0 :(得分: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))]

答案 1 :(得分: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'))]

答案 2 :(得分:0)

我已经制定了此算法,但是使用更高的数字似乎无法正常工作或运行速度很慢,它将在大数据集群(cloudera)中运行,因此我认为我必须将函数放入pyspark ,请帮忙。

将熊猫作为pd导入 将itertools导入为its

number_list = [10953,10423,10053]

def reducer(nums):   定义范围(n):     打印(n)     返回范围(n,-1,-1)

num_list = list(map(ranges,nums))   返回列表(itts.product(* num_list))

data = pd.DataFrame(reducer(number_list)) 打印(数据)