【问题标题】:Creating combination of value list with existing key - Pyspark创建值列表与现有键的组合 - Pyspark
【发布时间】:2016-08-18 19:52:45
【问题描述】:

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

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

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

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

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

我知道要获得价值部分,我会使用类似的东西

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

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

另外,最终,我想达到 k,v 的样子

((k1,v1,v2),1)

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

谢谢。

【问题讨论】:

  • 欢迎来到stackoverflow。请格式化您的问题,去掉缩写和read this document。这将使您的问题对未来的读者有用。

标签: python apache-spark mapreduce pyspark


【解决方案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))]

【讨论】:

  • 是的,我确实必须自己对其进行平面映射才能将其转换为最终所需的格式
【解决方案2】:

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

【讨论】:

  • 所以在 pyspark 中,我需要创建另一个函数来执行此操作吗?因为我不知道如何链接它。我考虑过创建一个函数,然后导入它,看起来像这样。我不知道是否有通过预建函数的本地方式来做到这一点。
  • 您可以创建一个函数,接收 k 和 v 的列表,并按照我的答案返回数据
  • 谢谢!让它工作并了解到我可以将一个函数粘贴到 pyspark 中!
【解决方案3】:

我已经制作了这个算法,但是如果数字越大,它看起来不起作用或者速度很慢,它将在大数据集群中运行(cloudera),所以我认为我必须将该函数放入 pyspark ,如果可以的话,请帮忙。

将熊猫导入为 pd 将 itertools 导入为 itts

number_list = [10953, 10423, 10053]

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

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

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

【讨论】:

    猜你喜欢
    • 2019-12-27
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多