Spark reducebykey - 列表元素的最小值

Posted

技术标签:

【中文标题】Spark reducebykey - 列表元素的最小值【英文标题】:Spark reducebykey - minimum of list element-wise 【发布时间】:2016-12-30 00:25:52 【问题描述】:

我在使用 Spark reduceByKey / groupByKey 函数时遇到问题。

我有一对(datetime, [a1, b1, c1, d1]), (datetime, [a2, b2, c2, d2]) ...形式的RDD

我想按键对这些元素进行分组(此处为相同的日期时间),并获得与元素最小值列表相对应的输出值。

在我的示例中,输出将是:

(datetime, [min(a1,a2), min(b1,b2), min(c1,c2), min(d1,d2)])

我试过了:

reduceByKey(lambda (a, b): [min(x) for x in zip(a, b)])

但到目前为止没有成功。

提前致谢

【问题讨论】:

您的尝试乍一看还不错。 不成功到底是什么意思? 在尝试上述操作时,我收到了 TypeError: <lambda>() takes exactly 1 argument (2 given) 错误。刚刚删除了 lambda 对象 (a,b) 的括号,似乎它正在工作.. 但我似乎无法理解为什么......无论如何谢谢! 哦,我错过了括号。使用lambda a, b: [min(x) for x in zip(a, b)] 【参考方案1】:

对于这个问题,我们有一个简单的解决方案。

在你的 map 函数中,reduce 之前。你应该像这样设置你的数据:

(datetime, ([a1, b1, c1, d1],))

请注意,我将列表插入到带有逗号的元组中。我正在做一个“开放”元组。而且你可以默认使用reduceByKey

reduceByKey(lambda a, b: a + b)

你会得到这样的rdd:

(datetime, ([a1, b1, c1, d1], [a2, b2, c2, d2]))

【讨论】:

这确实不能解决问题。 OP希望元素明智的最小值不分组。整个问题似乎是参数定义。

以上是关于Spark reducebykey - 列表元素的最小值的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark - 在作为列表的 spark 数据框列上使用 reducebykey

Java spark使用reduceByKey避免嵌套列表将对象连接到一个列表中

spark中reduce和reduceByKey的区别

Spark 算子 reduce / reduceByKey / reduceByKeyLocally 区别

Spark reduceByKey() 返回一个复合值

Spark(pyspark)如何仅在3元素元组的2个元素上reduceByKey