apache-spark - Spark RDD 的 take(1) 和 first() 的区别

标签 apache-spark pyspark rdd

我曾经认为 rdd.take(1)rdd.first()完全一样。然而,在我的同事向我指出 Spark's officiation documentation on RDD 后,我开始怀疑这是否真的如此。 :

first(): Return the first element in this RDD.

take(num): Take the first num elements of the RDD. It works by first scanning one partition, and use the results from that partition to estimate the number of additional partitions needed to satisfy the limit.



我的问题是:
  • first()的底层实现吗?与 take(1) 相同?
  • 假设 rdd1rdd2是由相同的 csv 构造的,我可以安全地假设 rdd1.take(1)rdd2.first()总是 返回相同的结果,即 csv 的第一行?如果 rdd1rdd2分区不同吗?
  • 最佳答案

    事实 first根据 take 实现.

    以下取自 spark 的 RDD.scala 来源. first来电take(1)如果找到则返回第一个元素。

      def first(): T = withScope {
        take(1) match {
          case Array(t) => t
          case _ => throw new UnsupportedOperationException("empty collection")
        }
      }
    
    take(num)尝试从 RDD 的第 0 个分区开始获取 num 个元素(如果您考虑基于 0 的索引)。所以 take(1) 和 first 的行为是相同的。

    甚至 spark programming guide证实了这一点。

    关于您的第二个问题:这取决于您所说的分区不同时的意思。如果您调用sc.textFile("/path/to/file")不管有没有 numPartitions,都没有关系,因为第 0 个分区总是第 0 个分区。所以是的,您可以假设它们将具有相同的第一个元素。

    编辑:RDD 中的分区是有序的,CSV 中的物理第一行最终会出现在 RDD 的第 0 个分区中。和take(1)first两者都将返回第 0 个分区的第一行。

    关于apache-spark - Spark RDD 的 take(1) 和 first() 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37495039/

    相关文章:

    apache-spark - 如何让 AWS 上的本地 Spark 写入 S3

    scala - 如何将 Dataframe 列名称与 Scala 案例类属性相匹配?

    apache-spark - 从 Kafka 流式传输的 PySpark 问题

    java - Scala/Java Spark

    python - 如何在流式查询中使用 MLlib 模型(失败并显示 "Field "功能“不存在。”)?

    python - 如何在 PySpark RDD 中返回不同的集合?

    python - 如何在集群上保存文件

    apache-spark - Spark历史服务器即使持久化也不显示RDD

    hadoop - Spark RDD 沿袭和存储

    python - 在 Spark Python 中对 RDD 执行集差