用combineByKey進行整數相加相當於將它們添加到列表中

2024-10-02 12:33:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个map函数,它创建一个类型为[Tuple,Integer]的键值对,但是当我使用combineByKey来添加整数值时,它会创建一个包含这些整数的元组,而不是添加它们

我试过输入整数,但没用

def subset_from_kv(para):
    sol = []

    para_new = (i for i in (para and ff))
    # print(list(para))
    tt = (itertools.combinations(sorted(para_new), size))

    for j in tt:
        flag = True

        for i in list(itertools.combinations(list(j), size-1)):

            if (i not in (frequent_itemset_val)):
                flag = False

                break
        if flag is True:
            sol.append(j)

    return sol


rdd1_values = rdd1_original.values()

rdd_inter = rdd1_values.mapPartitions(lambda t: subset_from_kv(t)).map(lambda x: (x, 1))

new_item_rdd_size_i = rdd_inter.combineByKey(
    lambda value: (value),
    lambda x, y: (x + y),
    lambda x, y: (x, y)
)

rdd_inter.collect()给出:

[(('-050d_XIor1NpCuWkbIVaQ', '-4TMQnQJW1yd6NqGRDvAeA'), 1), (('-050d_XIor1NpCuWkbIVaQ', '-6h3K1hj0d4DRcZNUtHDuw'), 1), (('-050d_XIor1NpCuWkbIVaQ', '-6tvduBzjLI1ISfs3F_qTg'), 1), (('-050d_XIor1NpCuWkbIVaQ', '-9eNGMp8XiygI8t8QFuFWw'), 1), (('-050d_XIor1NpCuWkbIVaQ', '-9nai28tnoylwViuJVrYEQ'), 1).....

编辑:我有3个分区

新物品\u rdd \u尺寸\u我希望提供

[(('-050d_XIor1NpCuWkbIVaQ', '-4TMQnQJW1yd6NqGRDvAeA'),(10, 1, 3), (('-050d_XIor1NpCuWkbIVaQ', '-6h3K1hj0d4DRcZNUtHDuw'), (12, 13, 5), (('-050d_XIor1NpCuWkbIVaQ', '-6tvduBzjLI1ISfs3F_qTg'), (21, 7, 33), (('-050d_XIor1NpCuWkbIVaQ', '-9eNGMp8XiygI8t8QFuFWw'), (111, 34, 14), (('-050d_XIor1NpCuWkbIVaQ', '-9nai28tnoylwViuJVrYEQ'), (41, 33, 11)...

但输出是串联1的值,而不是相加:

[(('-050d_XIor1NpCuWkbIVaQ', '-Bdw-5H5C4AYSMGnAvmnzw'), ((1, 1), 1)), (('-050d_XIor1NpCuWkbIVaQ', '-De4AV1Fx67mDMGrFOw44Q'), ((1, 1), 1)), (('-050d_XIor1NpCuWkbIVaQ', '-FLnsWAa4AGEW4NgE8Fqew'), ((1, 1), 1)), (('-050d_XIor1NpCuWkbIVaQ', '-Ht7HiGBox8lS1Y8IPjO8g'), ((1, 1), 1)), (('-050d_XIor1NpCuWkbIVaQ', '-ZBfr1BHvArFp1d6XH8jOQ'), ((1, 1), 1))]

Tags: lambdainnewforsize整数listflag
1条回答
网友
1楼 · 发布于 2024-10-02 12:33:04

根据official doc

combineByKey(
    createCombiner, 
    mergeValue, 
    mergeCombiners, 
    numPartitions=None, 
    partitionFunc=<function portable_hash>
)

使用:

  • createCombiner,它将V转换为C(例如,创建一个元素 (列表)
  • mergeValue,将V合并成C(例如,将V添加到a的末尾) (列表)
  • 合并合并器,将两个C合并为一个C(例如,合并 (列表)

在您的情况下:

  • createCombinerlambda value: (value):创建一个元组
  • mergeValuelambda x, y: (x + y):添加2个元组==>;1个元组,包含2个元素
  • mergeCombinerslambda x, y: (x, y):创建一个包含2个元素的元组

因此,您的最终输出是元组的元组的元组的元组的元组等等

您应该尝试一种更简单的方法,比如reduceByKeyrdd.reduceByKey(add)

相关问题 更多 >

    热门问题