我正在尝试使用 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 中。 谢谢
请您参考如下方法:
这里正确的做法是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 = data_.map(
lambda x: (x[u'driverId'] + ',' + x[u'afh'], int(x['timestamp']
)
由于 key 是动态生成的,因此您无法避免初始 map,因为对于任何 *byKey 操作, key 都应该预先知道。可以在 combineByKey 中执行值类型转换,但从根本上说,它不会影响必须访问数据的次数。
