我无法在以下代码中获得lambda的行为:
rdd = sc.parallelize([5,3,1,2)]
rdd.takeOrdered(3,lambda s: -1*s)
根据我的理解,lambda将一个操作应用于列表中的所有元素,所以我希望上面的代码返回
[-1,-2,-3]
但它返回了
[5,3,2]
我在这里缺少什么?
答案 0 :(得分:2)
https://spark.apache.org/docs/1.1.1/api/python/pyspark.rdd.RDD-class.html
takeOrdered(self,num,key = None)从订购的RDD中获取N个元素 按升序或由可选键功能指定。
所以在你的例子中,你提供了一个订单功能。
答案 1 :(得分:1)
rdd.takeOrdered实际上接受比较器作为它的第二个参数。
你想要做的是:
rdd.map(lambda s: -1*s).takeOrdered(3)
这将映射您的值,然后按顺序获取前3个。
我不确定你传给它的lamda有什么火花才是诚实的。
答案 2 :(得分:1)
可能更容易将第二个参数takeOrdered(lambda)视为“关键提取器”,因为它不会对基础数据进行任何转换。
在我们有这个数字数组的简单情况下,关键只是值
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采取订单时,你正在做的就是告诉它你想要的是什么。如果你想要额外的转换,它们必须在另一个步骤中发生。
要返回您想要的输出,您可以将项目映射到它们的反转,然后按原始值排序(反向的倒数):
rdd.map(lambda x: -x)\ #[-5,-3,-1,-2]
.takeOrdered(3, lambda x: -x) #[-1,-2,-3]
答案 3 :(得分:0)
首先尝试映射:
rdd = sc.parallelize([5,3,1,2)]
newRDD = rdd.map(lambda s: -1*s)
然后返回或打印动作(地图是转换)......例如
rdd.collect()
然后,如果您想采取数字或项目的特定顺序(升序或降序),您可以尝试使用takeOrdered(&#34;您想要的项目数量,&#34;您希望它们的顺序采取(-1逆转顺序)&#34;。
或
newRDD = (rdd
.map(lambda s: -1*s)
.takeOrdered(3, lambda s: -1*s))
答案 4 :(得分:0)
以下表示按降序获取前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)
答案 5 :(得分:0)
它与Python中现有的sorted
函数非常相似。查看&#34;关键功能&#34;上的示例。来自这个网站: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]
然后,选择前3项:[5, 3, 2]