值对组合成一个密钥
我正在写一个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
下一篇: Access a list index after introducing words using input