【问题标题】:last element in RDD using python sparkRDD中的最后一个元素使用python spark
【发布时间】:2015-03-05 18:33:58
【问题描述】:

我正在尝试从 Spark RDD 中获取最后一个元素信息。 我已经用 (key, value) 对的值对 RDD 进行了排序。

我在 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 中获取最后一个元素?

【问题讨论】:

标签: apache-spark rdd


【解决方案1】:

是的,还有其他方法。

这里有一些(包括你的)以及基于在我的机器上使用一个本地工作线程对每种方法进行 1000 次测试的非常非正式的性能排名——使用你在问题中提供的数据集。

1) 最大值()

在这个 RDD 中找到最大的项目。

output = (
          rdd.map(lambda (a, b): (b, a))
          .max()
         )

这是平均第一快。

2) sortByKey() -- 使用 first()

对这个 RDD 进行排序,假设它由 (key, value) 对组成。

返回此 RDD 中的第一个元素。

output = (
          rdd.map(lambda (a, b): (b, a))
          .sortByKey(ascending=False)
          .first()
         )

这是平均第四快。

3) 顶部()

从 RDD 中获取前 N 个元素。

output = (
          rdd.map(lambda (a, b): (b, a))
          .top(1)
         )

这是平均第三快

4) top() -- 带比较键

从 RDD 中获取前 N 个元素。

output = (
          rdd.top(1, key=lambda x: x[1])
         )

这是平均第二快。

最后的想法

您会注意到第 4 种方法不会交换(键/值)的。相反,它使用 key ('key' 参数 - 不是你的 rdd 的一部分)扫过 rdd,指定一个参数的函数,用于从可迭代的每个元素中提取比较键,在这种情况下,比较键是 (key, value) 元组中的第二项,即 value。

所以方法1 max() 非常好。但是...

一旦您进入需要“最后一个 n 个元素”(即不仅仅是最后一个元素)的领域,那么我会说方法4 是首选方式。

【讨论】:

    【解决方案2】:

    RDD.first() 非常高效,因为它可以以短路方式执行。由于您无论如何都要对数据进行排序,因此按元组中的第二个值,对 RDD 进行反向排序,然后只取第一个元素。

    【讨论】:

      猜你喜欢
      • 2021-08-10
      • 1970-01-01
      • 1970-01-01
      • 2017-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      相关资源
      最近更新 更多