首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ncr与pyspark nc3的组合

ncr与pyspark nc3的组合
EN

Stack Overflow用户
提问于 2019-10-14 22:46:35
回答 1查看 112关注 0票数 0
代码语言:javascript
复制
random42 = sorted(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q','R','S','T','U','V','W','X','Y'])        

我需要一个ncr输出有以下三个标签在pyspark代码中的组合

'AAJ','AAB','AAC','AAD','AAE','AAF','AAG','AAH','AAI',‘AAJ’,'AAK','AAL','AAM','AAN','AAO','AAP','AAQ','AAR','AAS','BAA','BAB','BAC','BAD','BAE','BAF','BAG',‘BAV’,'BAI','BAJ','BAK','BAL','BAM','BAN','BAO','BAP','BAQ','BAR','BAS','BAT','BAU','BAV'...'YYT','YYU','YYV','YYW','YYX','YYY‘

代码语言:javascript
复制
>>> rdd = sc.parallelize([1, 2])
>>> sorted(rdd.cartesian(rdd).collect())
[(1, 1), (1, 2), (2, 1), (2, 2)]

我需要像这样的三个字母的组合

代码语言:javascript
复制
>>> rdd = sc.parallelize([1, 2, 3, 4, 5])
>>> sorted(rdd.cartesian(rdd).collect())
[(1, 2, 3), (1, 2, 4), (2, 3, 4), (2,3,5)]

我在pyspark中寻找,因为我有1000多个元素可以选择1000个C_3

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-15 01:50:54

这是一个使用spark数据框架实现的示例,将对您有所帮助。主要思想是使用itertools.combinationsudf

注意:您可以将RDD转换为spark数据帧,以适应我的示例。

代码语言:javascript
复制
import pyspark.sql.functions as F
import itertools
from pyspark.sql.types import StringType, ArrayType

#create a sample data frame
df = spark.createDataFrame([(['A','B','C','D','E'],),(['F','G','H','I','J'],)],('txt',))
df.show()

# +---------------+
# |            txt|
# +---------------+
# |[A, B, C, D, E]|
# |[F, G, H, I, J]|
# +---------------+

#udf part
def ncr(x,r):
    return [''.join(_) for _ in itertools.combinations(x, r)]

r = 3

udf_ncr = F.udf(lambda t: ncr(t,r), ArrayType(StringType()))

df = df.withColumn('output', udf_ncr('txt'))

df.show(truncate=False)

# +---------------+--------------------------------------------------+
# |txt            |output                                            |
# +---------------+--------------------------------------------------+
# |[A, B, C, D, E]|[ABC, ABD, ABE, ACD, ACE, ADE, BCD, BCE, BDE, CDE]|
# |[F, G, H, I, J]|[FGH, FGI, FGJ, FHI, FHJ, FIJ, GHI, GHJ, GIJ, HIJ]|
# +---------------+--------------------------------------------------+

Edit:新增rdd实现示例,如下所示:

代码语言:javascript
复制
rdd = sc.parallelize([(['A','B','C','D','E']),(['F','G','H','I','J'])])

def ncr(x,r):
    return [''.join(_) for _ in itertools.combinations(x, r)]

r = 3

rdd.map(lambda x: ncr(x,r)).collect()

#[['ABC', 'ABD', 'ABE', 'ACD', 'ACE', 'ADE', 'BCD', 'BCE', 'BDE', 'CDE'],
# ['FGH', 'FGI', 'FGJ', 'FHI', 'FHJ', 'FIJ', 'GHI', 'GHJ', 'GIJ', 'HIJ']]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58379175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档