在一次操作中使用spark查找reduceByKey的值范围

时间:2016-07-15 13:32:44

标签: python apache-spark mapreduce pyspark rdd

我正在尝试使用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中。 感谢

1 个答案:

答案 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内执行,但从根本上说它不会影响必须访问数据的次数。