使用CombineByKey添加整数会将其添加到列表中

时间:2019-06-10 08:19:57

标签: python pyspark

我有一个映射函数,可创建类型为[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个分区

new_item_rdd_size_i应该会提供

[(('-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))]

1 个答案:

答案 0 :(得分:0)

根据official doc

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

与:

  • createCombiner ,它将V变成C(例如,创建一个元素 列表)
  • mergeValue ,将V合并为C(例如,将其添加到A的末尾 列表)
  • mergeCombiners ,将两个C合并为一个(例如,合并 列表)

在您的情况下:

  • createCombiner lambda value: (value):您创建一个元组
  • mergeValue lambda x, y: (x + y):您添加2个元组==> 1个具有2个元素的元组
  • mergeCombiners lambda x, y: (x, y):您创建了一个包含2个元素的元组...

因此,您的最终输出是tuple的tuple的tuple的tuple。...

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