Pyspark combineByKey元组列表和计数

时间:2016-05-08 16:44:27

标签: python apache-spark pyspark

我一直难以将rdd中两个浮点数的键控元组组合成一个列表中的关键元组列表和每个键的每个键的计数。我正在使用rdd。 combineByKey这样做。如果我将值传递给combineByKey之外的三个lambda,我会得到我期望的结果,一个元组和元组列表的键和元组。但是,当我使用combineByKey执行此操作时,我得到一个键和一个常量值和计数列表的元组。我可能在这里缺少什么?我抓住了下面的REPL输出来说明。

j = jnd.take(2)

j

[[u'14225532965000', (0.2072, 82777.0)], [u'14217732824000', (0.20361902000000001, 77271.0)]]
creCmb = (lambda v: ([v[1]], 1))
mrgVal = (lambda x, v: (x[0]+[v[1]], x[1]+1))
mrgCmb = (lambda x, y: (x[0]+y[0], x[1]+y[1]))
x = creCmb(j[0])

x

([(0.2072, 82777.0)], 1) 
m = mrgVal(x, j[1])

m

([(0.2072, 82777.0), (0.20361902000000001, 77271.0)], 2) 
r = mrgCmb(m, m)

r

([(0.2072, 82777.0), (0.20361902000000001, 77271.0), (0.2072, 82777.0), (0.20361902000000001, 77271.0)], 4) 
cmb = jnd.combineByKey(creCmb, mrgVal, mrgCmb) 
cmb.count() 
4513
cmb.take(1)
[(u'14225532026000', ([56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, ...
... 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0], 741))]

1 个答案:

答案 0 :(得分:0)

combineByKey仅调用每行上提供给它的函数。在creCmbmrgVal中,当您使用v[1]而不是v时,您只保留每个值元组的第二个元素,从而生成单个元素的列表结束。在测试中,您在键值对上调用creCmb而不仅仅是值元组,这就是测试输出正确但mergeByKey输出不正确的原因。

要解决此问题,只需从[1]creCmb移除mrgVal索引:

creCmb = (lambda v: ([v], 1))
mrgVal = (lambda x, v: (x[0]+[v], x[1]+1))