我正在尝试从Spark RDD获取最后一个元素信息。
我已经将RDD分别与(key, value)
对的值进行了排序。
我在RDD中的数据
(8, 0.98772733936789858)
(4, 3.0599761935471004)
(2, 3.1913934060593321)
(1, 4.9646263295153013)
(5, 5.3596802463208792)
(7, 5.5829277439661071)
(9, 6.4739040233992258)
(0, 6.9343681509951081)
(6, 7.4699692671955953)
(3, 8.6579764626088771)
我能够使用第一个函数获得第一个(key, value)
对,但无法弄清楚如何获取最后一个。我可以将(key, value)
对交换为(value, key)
对,并使用.max函数获取所需数据。但是,有没有其他方法可以使用Python spark从RDD获取最后一个元素?
答案 0 :(得分:4)
是的,还有其他方法。
以下是一些(包括您的)非常非正式的性能排名,基于每个方法1000次测试,我的机器上有一个本地工作线程 - 使用您在问题中提供的数据集。
找到此RDD中的最大项目。
output = (
rdd.map(lambda (a, b): (b, a))
.max()
)
这是平均第一快。
对此RDD进行排序,假定其由(键,值)对组成。
返回此RDD中的第一个元素。
output = (
rdd.map(lambda (a, b): (b, a))
.sortByKey(ascending=False)
.first()
)
这是平均速度第四快。
从RDD获取前N个元素。
output = (
rdd.map(lambda (a, b): (b, a))
.top(1)
)
这是平均速度第三快
从RDD获取前N个元素。
output = (
rdd.top(1, key=lambda x: x[1])
)
这是平均来说第二快。
您会注意到第4种方法不会交换(键/值)。相反,它用键('键'参数 - 不是你的rdd的一部分)扫描rdd,指定一个参数的函数,用于从每个参数中提取比较键。可迭代中的元素,在这种情况下,比较键是您的(键,值)元组中的第二项,即值。
所以方法1,max(),非常好。但是......
一旦您进入需要最后 n 元素的地区(即不仅仅是最后一个元素)<强>然后我会说方法4是首选方式。
答案 1 :(得分:3)
RDD.first()非常有效,因为它可以以短路方式执行。因为你无论如何都要对数据进行排序,通过元组中的第二个值,将RDD反转排序,然后只取第一个元素。