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

2024-10-04 03:29:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用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))

当然,输出是列表中的列表和列表中的列表

我知道解决办法是

^{pr2}$

其次是

.reduceByKey(min)

然后将它们组合起来,但我不想执行两个操作

但我希望一次完成,这样应用程序就不会效率低下。我也希望避免首先填充整数列表。 有什么想法吗?数据在RDD中。 谢谢


Tags: lambda函数map列表datareturndefrange
1条回答
网友
1楼 · 发布于 2024-10-04 03:29:43

正确的方法是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是由于:

^{pr2}$

因为key是动态生成的,所以您不能避免初始的map,因为任何*byKey操作都应该预先知道密钥。值类型转换可以在combineByKey内执行,但基本上它不会影响数据访问的次数。在

相关问题 更多 >