值对组合成一个密钥

我正在写一个Spark应用程序,并希望将一组键值对(K, V1), (K, V2), ..., (K, Vn)成一个键 - 多值对(K, [V1, V2, ..., Vn]) 。 我觉得我应该可以使用reduceByKey函数来实现这一点:

My_KMV = My_KV.reduce(lambda a, b: a.append([b]))

发生这种情况时出现的错误是:

'NoneType'对象没有'append'属性。

我的键是整数,值V1,...,Vn是元组。 我的目标是用键和值列表(元组)创建一个单对。


Map和ReduceByKey

reduce输入类型和输出类型必须相同,因此如果要汇总列表,则必须将输入map到列表。 之后,您将列表组合成一个列表。

合并列表

您需要一种方法将列表合并到一个列表中。 Phyton提供了一些方法来组合列表。

append修改第一个列表并且总是返回None

x = [1, 2, 3]
x.append([4, 5])
# x is [1, 2, 3, [4, 5]]

extend也是一样的,但解开列表:

x = [1, 2, 3]
x.extend([4, 5])
# x is [1, 2, 3, 4, 5]

两种方法都返回None ,但您需要一个返回组合列表的方法,因此只需使用加号。

x = [1, 2, 3] + [4, 5]
# x is [1, 2, 3, 4, 5]

火花

file = spark.textFile("hdfs://...")
counts = file.flatMap(lambda line: line.split(" ")) 
         .map(lambda actor: (actor.split(",")[0], actor))  

         # transform each value into a list
         .map(lambda nameTuple: (nameTuple[0], [ nameTuple[1] ])) 

         # combine lists: ([1,2,3] + [4,5]) becomes [1,2,3,4,5]
         .reduceByKey(lambda a, b: a + b)

CombineByKey

也可以用combineByKey来解决这个问题,在内部使用combineByKey来实现reduceByKey ,但它更复杂,并且“使用Spark中的一个专用的每个键组合器可以更快”。 上面的解决方案足以让你的用例足够简单。

GroupByKey

使用groupByKey也可以解决这个groupByKey ,但它会降低并行性,因此对于大数据集可能会慢很多。


我谈话迟到了,但这是我的建议:

>>> foo = sc.parallelize([(1, ('a','b')), (2, ('c','d')), (1, ('x','y'))])
>>> foo.map(lambda (x,y): (x, [y])).reduceByKey(lambda p,q: p+q).collect()
[(1, [('a', 'b'), ('x', 'y')]), (2, [('c', 'd')])]

您可以使用RDD groupByKey方法。

输入:

data = [(1, 'a'), (1, 'b'), (2, 'c'), (2, 'd'), (2, 'e'), (3, 'f')]
rdd = sc.parallelize(data)
result = rdd.groupByKey().collect()

输出:

[(1, ['a', 'b']), (2, ['c', 'd', 'e']), (3, ['f'])]
链接地址: http://www.djcxy.com/p/22571.html

上一篇: value pair into a key

下一篇: Access a list index after introducing words using input