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

Posted

技术标签:

【中文标题】减少火花返回字典而不是数据帧中的操作【英文标题】:reduce operation in spark returning dictionary instead dataframe 【发布时间】:2018-04-29 17:25:18 【问题描述】:

我正在编写一个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 的数据框,一个带有 Transaction id 的元组及其购买的产品(A->B 交易)和 count。所以我现在的目标是创建一个产品数量(A->B)的数据框,通过组合所有交易细节类似于以下内容:

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

使用上面的代码,我可以做到,但结果是字典。我需要一个数据框,以便进一步进行。因为如果它被转换为字典,那么在 Spark 中写这个没有意义。

【问题讨论】:

如果您共享数据框的架构、输入数据框示例和预期数据框示例,将会很有帮助 【参考方案1】:

这只是一个字数,所以要么reduceByKey 得到RDD

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

【讨论】:

而不是 count 你应该做 sum 聚合 ;)

以上是关于减少火花返回字典而不是数据帧中的操作的主要内容,如果未能解决你的问题,请参考以下文章

限制火花上下文中的记录数量

验证输入火花数据帧中的时间戳以生成正确的输出火花数据帧

如何截断火花数据框列的值? [复制]

将火花数据帧中的日期时间时间戳转换为 epocTimestamp

将字符串格式的科学记数法转换为火花数据帧中的数字[重复]

从火花数据帧中读取结构[重复]