减少火花返回字典中的操作而不是数据帧

时间:2018-04-29 17:25:18

标签: python-3.x apache-spark pyspark

我正在编写reduce操作,我期待的是数据帧而不是字典。根据以下代码,它将提供字典

def funReduce(a, b):
    result = {}
    # first element
    if type(a) is tuple:
        result = a[1]
    else:
        result = a
    if b is not None:
        for key in list(b[1].keys()):
            if key not in result:
                result[key] = 1
            else:
                result[key] = result[key] + 1
    return result

d = sc.parallelize([(1305670057984, {(1000001256903, 1000001120912): 1, (1000001423245, 1000001120913): 1}), (1000001256903, {(1000001256903, 1000001120912): 1})])

s = d.reduce(funReduce)

我有一个类似于d的数据框,一个带有交易ID的元组及其带有计数的购买产品(A-> B交易)。因此,我现在的目标是通过组合所有与以下类似的交易细节来创建产品数量的数据框(A-> B):

{(1000001423245, 1000001120913): 1, (1000001256903, 1000001120912): 2}

使用上面的代码,我能够做到,但结果是字典。我需要一个数据帧,以便继续进行。因为如果将它转换为字典,那么在Spark中写这篇文章就没有意义了。

1 个答案:

答案 0 :(得分:0)

这只是一个字数,所以reduceByKeyRDD

d.values().flatMap(lambda d: ((x, 1) for x in d.keys())).reduceByKey(lambda x, y: x + y).collect()
# [((1000001423245, 1000001120913), 1), ((1000001256903, 1000001120912), 2)]

explodeagg

from pyspark.sql.functions import explode

spark.createDataFrame(d).select(explode("_2")).groupBy("key").count().show(truncate=False)
# +------------------------------+-----+
# |key                           |count|
# +------------------------------+-----+
# |[1000001423245, 1000001120913]|1    |
# |[1000001256903, 1000001120912]|2    |
# +------------------------------+-----+

获取DataFrame