我正在尝试使用pyspark将reduceByKey函数的输出作为相对于键传递的整数范围。
我尝试制作自定义功能:
def _range(x,y):
return [max(x,y), min(x,y)]
data2 = data_.map(lambda x: (x[u'driverId'] + ',' + x[u'afh'], int(x['timestamp'])))
.reduceByKey(lambda x,y: _range(x,y))
当然输出是列表中列表中的列表
我知道解决方案是
.reduceByKey(max)
接着是
.reduceByKey(min)
^^^^然后组合它们,但我不想执行两个操作
但我想在一次通过中执行此操作,因此应用程序效率不高。我还想避免首先填充整数列表。 有任何想法吗?数据在RDD中。 感谢
答案 0 :(得分:1)
这里的正确方法combineByKey
定义如下:
def seq_op(acc, x):
return (min(x, acc[0]), max(x, acc[1]))
def comb_op(acc1, acc2):
return (min(acc1[0], acc2[0]), max(acc1[1], acc2[1]))
(pairs
.aggregateByKey((sys.float_info.max, sys.float_info.min), seq_op, comb_op)
.mapValues(lambda minmax: abs(minmax[0] - minmax[1])))
其中pairs
的结果为:
pairs = data_.map(
lambda x: (x[u'driverId'] + ',' + x[u'afh'], int(x['timestamp']
)
由于密钥是动态生成的,因此无法避免初始map
,因为任何*byKey
操作都应预先知道密钥。值类型转换可以在combineByKey
内执行,但从根本上说它不会影响必须访问数据的次数。