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]
我无法完全理解以下代码中 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]