我正在编写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中写这篇文章就没有意义了。
答案 0 :(得分:0)
这只是一个字数,所以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)]
或explode
和agg
:
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
。