ncr комбинации с pyspark nc3 - PullRequest
0 голосов
/ 14 октября 2019
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

['AAA', '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 ',' BAH ',' BAI ',' BAJ ',' BAK ',' BAL ', «BAM», «BAN», «BAO», «BAP», «BAQ», «BAR», «BAS», «BAT», «BAU», «BAV» ... «YYT», «YYU», 'YYV', 'YYW', 'YYX', 'YYY']

>>> rdd = sc.parallelize([1, 2])
>>> sorted(rdd.cartesian(rdd).collect())
[(1, 1), (1, 2), (2, 1), (2, 2)]

Мне нужна трехбуквенная комбинация типа

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

1 Ответ

1 голос
/ 14 октября 2019

Вот пример, реализованный с фреймом искровых данных, который поможет вам. Основная идея состоит в том, чтобы использовать itertools.combinations и udf.

Примечание. Вы можете преобразовать ваш RDD в искровой фрейм данных, чтобы приспособиться к моему примеру.

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]|
# +---------------+--------------------------------------------------+

Редактировать: добавлен пример реализации с rdd следующим образом,

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']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...