创建值列表与现有键的组合- 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 v看起来像

((k1,v1,v2),1)

我知道如何从我正在寻找的到那个,但也许直接去那里更容易?

谢谢。

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

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))]

使用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'))]

我已经做了这个算法,但是更高的数字看起来不工作或者它很慢,它会在一个大数据集群(cloudera)中运行,所以我认为我必须把这个函数放入pyspark,如果你可以的话请帮忙。

import pandas as pd导入itertools为itts

number_list = [10953, 10423, 10053]

def减速器(num):def范围(n):打印(n)返回范围(n, -1, -1)

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

data = pd.DataFrame(减速机(number_list))打印(数据)

相关内容

  • 没有找到相关文章

最新更新