takeOrdered 函数中的 lambda 函数如何在 pySpark 中工作?

How lambda function in takeOrdered function works in pySpark?

我无法完全理解以下代码中 lambda 的行为:

rdd = sc.parallelize([5,3,1,2)]
rdd.takeOrdered(3,lambda s: -1*s)

据我了解,lambda 对列表中的所有元素应用一个操作,所以我希望上面的代码 return

[-1,-2,-3]

但是 returned

[5,3,2]

我在这里错过了什么?

https://spark.apache.org/docs/1.1.1/api/python/pyspark.rdd.RDD-class.html

takeOrdered(self, num, key=None) Get the N elements from a RDD ordered in ascending order or as specified by the optional key function.

因此在您的示例中,您提供了一个订单功能。

rdd.takeOrdered 实际上接受一个比较器作为它的第二个参数。

你要做的是:

rdd.map(lambda s: -1*s).takeOrdered(3)

这将映射您的价值观,然后按顺序取前 3 个。

老实说,我不确定 spark 对你传递的 lamda 做了什么。

可能你想这样做

rdd.takeOrdered(3, key = lambda s: (-1*s))

先尝试映射:

rdd = sc.parallelize([5,3,1,2)]
newRDD = rdd.map(lambda s: -1*s)

然后return或者打印一个动作(map是一个转换)...例如

rdd.collect()

然后,如果您想对数字或项目进行特定排序(升序或降序),您可以尝试使用 takeOrdered("number of items you want, "the order in which you want them to be taken (-1 reverse the顺序)".

newRDD = (rdd
           .map(lambda s: -1*s)
           .takeOrdered(3, lambda s: -1*s))

以下表示按降序获取前3个元素,lambda基本上应用于排序属性而不是最终结果。

rdd.takeOrdered(3, key = lambda s: -s)

以下表示按升序获取前3个元素:

rdd.takeOrdered(3, key = lambda s: s)

你想要做的是在 takeOrdered 之前使用 map 函数,map 函数实际应用于列表中的每个元素,即 map 用于修改列表中的每个值,产生所需的[-1, -2, -3]

的输出
rdd = sc.parallelize([5,3,1,2])
rdd.map(lambda s: -s).takeOrdered(3, key = lambda s: -s)

将 takeOrdered 的第二个参数 lambda 视为 "key extractor" 可能更容易,因为它不会对基础数据进行任何转换。

在我们得到这个数字数组的简单情况下,键就是值

rdd = sc.parallelize([5,3,1,2)]   
rdd.takeOrdered(3, lambda x: x) #[1,2,3]

或者,在您提交的代码中,项目按值的倒数排序 (-5 < -3 < -2 ...)。

rdd.takeOrdered(3, lambda x: -x) #[5,3,2]

当您将 lambda 传递给 takeOrdered 时,您所做的就是告诉它您希望它按什么进行排序。如果你想要额外的转换,它们必须在另一个步骤中发生。

要return你想要的输出,你可以将项目映射到它们的倒数,然后将它们按原始值排序(倒数的倒数):

rdd.map(lambda x: -x)\ #[-5,-3,-1,-2]
   .takeOrdered(3, lambda x: -x) #[-1,-2,-3]

它与 Python 中现有的 sorted 功能非常相似。从该站点查看 "key Functions" 上的示例:https://wiki.python.org/moin/HowTo/Sorting

您从 [5, 3, 1, 2] 开始。

假设密钥附加为 [(5, -5), (3, -3), (1, -1), (2, -2)]

然后,按升序键对其进行排序,得到:[(5, -5), (3, -3), (2, -2), (1, -1)]

现在,忽略每对中的第二个元素(密钥):[5, 3, 2, 1]

然后,select 前 3 项:[5, 3, 2]