CombineByKey不允许使用flatMapValues派生(键,值)对

时间:2019-06-05 04:05:27

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

我正在处理一个MapReduce问题,我想过滤每个Map分区输出,我只想过滤那些在其map-partition中出现超过阈值的键。

所以我有一个像Array.find()

这样的RDD

对于元组的每个值,我想获取其在整个RDD中的出现次数,除以map-partitions。然后,我将过滤此计数。

(key, value<tuple>)

使用flatMapValues我可以将其减少为

Eg: RDD: {(key1, ("a","b","c")), 
          (key2, ("a","d"), 
          (key3, ("b","c")}

现在使用{(key1, a), (key1, b), (key1, c), (key2, a), (key2, d), (key3, b), (key3, c)} 步骤,我已经能够获取相应分区中每个值的计数。

假设有两个分区,则它将像

一样返回
combineByKey

现在,我要过滤此(键,值),以便值的元组可以构成单个键-值对,即flatMapValues之前为我完成的操作,但是我无法使用flatMapValues

("a", [1, 1]), ("b", [1,1]), ("c", [1,1]), ("d", 1)

预期答案:

python

from itertools import count

import pyspark
import sys
import json
from pyspark import SparkContext
from pyspark.sql import SparkSession
from pyspark.rdd import RDD

sc = SparkContext('local[*]', 'assignment2_task1')

RDD = sc.textFile(sys.argv[1])

rdd1_original = RDD.map(lambda x: x.split(",")).map(lambda x: (x[0], [x[1]])).reduceByKey(lambda x, y: x + y)


rdd3_candidate = rdd1_original.flatMapValues(lambda a: a).map(lambda x: (x[1], 1)).combineByKey(lambda value: (value),lambda x, y: (x + y),                                                                                              lambda x, y: (x,y))

new_rdd = rdd3_candidate.flatMapValues(lambda a:a)
print(new_rdd.collect())

当前错误:

[("a",1),("a", 1), ("b", 1), ("b", 1), ("c", 1), ("c", 1), ("d", 1)

0 个答案:

没有答案