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)
,并返回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.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的链接。