python-3.x - 如何在pyspark中使用其他Rdd元素的所有可能组合创建新Rdd?
问题描述
嗨,我创建了一个如下所示的 Rdd
rdd1=sc.parallelize(['P','T','K'])
rdd1.collect()
['P', 'T', 'K']
现在我想RDD2
用所有可能的组合创建新的,如下面的新RDD.ie除了相同的元素组合,如(p,p),(k,k),(t,t)。
我在做时的预期输出
RDD2.collect()
[
('P'),('T'),('K'),
('P','T'),('P','K'),('T','K'),('T','P'),('K','P'),('K','T'),
('P','T','K'),('P','K','T'),('T','P','K'),('T','K','P'),('K','P','T'),('K','T','P')
]
解决方案
您似乎希望rdd
在每行包含唯一值的地方生成元素的所有排列。
一种方法是首先创建一个辅助函数来生成所需的长度组合n
:
from functools import reduce
from itertools import chain
def combinations_of_length_n(rdd, n):
# for n > 0
return reduce(
lambda a, b: a.cartesian(b).map(lambda x: tuple(chain.from_iterable(x))),
[rdd]*n
).filter(lambda x: len(set(x))==n)
本质上,该函数将自己进行n
笛卡尔积,rdd
并仅保留所有值都不同的行。
我们可以对此进行测试n = [2, 3]
:
print(combinations_of_length_n(rdd1, n=2).collect())
#[('P', 'T'), ('P', 'K'), ('T', 'P'), ('K', 'P'), ('T', 'K'), ('K', 'T')]
print(combinations_of_length_n(rdd1, n=3).collect())
#[('P', 'T', 'K'),
# ('P', 'K', 'T'),
# ('T', 'P', 'K'),
# ('K', 'P', 'T'),
# ('T', 'K', 'P'),
# ('K', 'T', 'P')]
您想要的最终输出只是union
这些中间结果与原始结果rdd
(值映射到tuple
s)。
rdd1.map(lambda x: tuple((x,)))\
.union(combinations_of_length_n(rdd1, 2))\
.union(combinations_of_length_n(rdd1, 3)).collect()
#[('P',),
# ('T',),
# ('K',),
# ('P', 'T'),
# ('P', 'K'),
# ('T', 'P'),
# ('K', 'P'),
# ('T', 'K'),
# ('K', 'T'),
# ('P', 'T', 'K'),
# ('P', 'K', 'T'),
# ('T', 'P', 'K'),
# ('K', 'P', 'T'),
# ('T', 'K', 'P'),
# ('K', 'T', 'P')]
概括任何最大重复次数:
num_reps = 3
reduce(
lambda a, b: a.union(b),
[
combinations_of_length_n(rdd1.map(lambda x: tuple((x,))), i+1)
for i in range(num_reps)
]
).collect()
#Same as above
注意:笛卡尔积是昂贵的操作,应尽可能避免。
推荐阅读
- c# - C#如何在二维数组中获取子数组?
- amazon-web-services - 使用 kinesisstream 将日志记录到 ElasticsSearch
- html - 如何在不使用 JavaScript 的情况下将 contenteditable 文本传递到服务器?
- ruby-on-rails - 性能改进轨道 postgreql
- android - 自 2020 年起每 5 分钟获取当前 GPS 位置的最有效方式
- elastic-stack - 如何在 Kibana 中为特定用户提供只读仪表板
- continuous-integration - 如何在 circle-ci/azure-pipeline/any-other-ci 中禁用 master 上的构建并发?
- flutter - 在 Flutter 中更改 Drawer 小部件的顶部颜色
- security - Heroku 如何知道您的密码被报告为已泄露?
- c++ - 为什么我的 char 数组长度不正确?