Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Spark RDD和x27之间的差异;让我们先看(1)和(1)_Apache Spark_Pyspark_Rdd - Fatal编程技术网

Apache spark Spark RDD和x27之间的差异;让我们先看(1)和(1)

Apache spark Spark RDD和x27之间的差异;让我们先看(1)和(1),apache-spark,pyspark,rdd,Apache Spark,Pyspark,Rdd,我曾经认为rdd.take(1)和rdd.first()是完全相同的。然而,在我的同事指出我之后,我开始怀疑这是否真的是真的: first():返回此RDD中的第一个元素 获取(num):获取RDD的第一个num元素。 它的工作原理是首先扫描一个分区,然后使用该分区的结果来估计满足该限制所需的额外分区的数量 我的问题是: first()的底层实现是否与take(1)相同 假设rdd1和rdd2是从同一个csv构建的,我可以安全地假设rdd1.take(1)和rdd2.first()将始终返回相同

我曾经认为
rdd.take(1)
rdd.first()
是完全相同的。然而,在我的同事指出我之后,我开始怀疑这是否真的是真的:

first():返回此RDD中的第一个元素

获取(num):获取RDD的第一个num元素。 它的工作原理是首先扫描一个分区,然后使用该分区的结果来估计满足该限制所需的额外分区的数量

我的问题是:

  • first()
    的底层实现是否与
    take(1)
    相同
  • 假设
    rdd1
    rdd2
    是从同一个csv构建的,我可以安全地假设
    rdd1.take(1)
    rdd2.first()
    始终返回相同的结果,即csv的第一行吗?如果
    rdd1
    rdd2
    的分区不同怎么办 不,两者不一样

    rdd.first()
    将返回此rdd中的第一个元素 而
    rdd.take(1)
    将返回一个仅包含第一个元素的数组

  • first()的底层实现与take(1)相同吗
  • 回答:在实现方面,
    first()
    在内部调用
    take(1)
    ,并返回
    take(1)
    返回的数组的第一个也是唯一一个元素。取自
    org.apache.spark.rdd.rdd
    class

      /**
       * Return the first element in this RDD.
       */
      def first(): T = withScope {
        take(1) match {
          case Array(t) => t
          case _ => throw new UnsupportedOperationException("empty collection")
        }
      }
    
  • 假设rdd1和rdd2是从同一个csv构建的,我可以安全地假设
    rdd1.take(1)
    rdd2.first()
    将始终返回相同的结果,即csv的第一行吗?如果rdd1和rdd2的分区不同呢

  • 答:是的,您可以假设,分区不会改变读取输入的顺序。

    事实上
    首先
    是按照
    take
    实现的

    以下是从spark的源代码中提取的
    first
    调用
    take(1)
    并返回找到的第一个元素

      def first(): T = withScope {
        take(1) match {
          case Array(t) => t
          case _ => throw new UnsupportedOperationException("empty collection")
        }
      }
    

    >取(Num)试图从RDD的零分区开始(如果考虑0个索引),使用NUM元素。所以take(1)和first的行为是相同的

    就连政府也证实了这一点

    关于你的第二个问题:这取决于你说“分区不同”是什么意思。如果您正在调用
    sc.textFile(“/path/to/file”)
    ,无论是否使用numPartitions,这都无关紧要,因为第0个分区将始终是第0个分区。所以是的,你可以假设它们有相同的第一个元素


    编辑:RDD中的分区已排序,CSV中的物理第一行将在RDD上的第0个分区中结束。和
    take(1)
    first
    都将返回第0个分区的第一行。

    因此,看起来两者是相同的,但我们确实有差异

    1.当我们从文件中读取数据时,默认情况下它是一个RDD,RDD同时具有
    first()
    take()
    属性。
    2.
    first()
    属性返回行类型对象,而
    take()
    返回列表类型

    但是 一旦我们使用
    .toDF()
    将RDD转换为数据帧,该DF上就没有
    first()
    属性

    希望它能进一步澄清这些概念


    同意Praveen Shukla的答案+1。添加指针@Ida:请看看RDD.scala是如何在这里设计的。。谢谢@RamPrasadG。我在回答中添加了RDD.scala的链接。