rdd.take(1)
とrdd.first()
はまったく同じだと思っていました。しかし、同僚が私に RDDに関するSparkの職務文書 :
first():このRDDの最初の要素を返します。
take(num):RDDの最初のnum要素を取得します。最初に1つのパーティションをスキャンし、そのパーティションの結果を使用して、制限を満たすために必要な追加のパーティションの数を推定します。
私の質問は:
first()
の基礎となる実装はtake(1)
と同じですか?rdd1
_と_rdd2
_が同じcsvから構築されていると仮定すると、rdd1.take(1)
とrdd2.first()
は常に同じ結果、つまりcsv?の最初の行を返します。 _rdd1
_と_rdd2
_のパーティションが異なる場合はどうなりますか?事実first
はtake
の観点から実装されています。
以下は、 RDD.scala のsparkのソースから取られています。 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の動作は同じです。
スパークプログラミングガイド でもこれを確認できます。
2番目の質問について:パーティション分割が異なると言うときの意味によって異なります。 numPartitionsの有無にかかわらずsc.textFile("/path/to/file")
を呼び出す場合、0番目のパーティションは常に0番目のパーティションになるため、問題にはなりません。はい、あなたは彼らが同じ最初の要素を持っていると仮定することができます。
編集:RDDのパーティションは順序付けられ、CSVの物理的な最初の行はRDDの0番目のパーティションになります。 take(1)
とfirst
は両方とも、0番目のパーティションの最初の行を返します。
両方は同じではありません。
rdd.first()
はこのRDDの最初の要素を返し、rdd.take(1)
は最初の要素のみを持つ配列を返します。
Ans:実装に関して、first()は内部でtake(1)を呼び出し、take(1)によって返される配列の最初で唯一の要素を返します。 org.Apache.spark.rdd.RDDクラスから取得
/**
* Return the first element in this RDD.
*/
def first(): T = withScope {
take(1) match {
case Array(t) => t
case _ => throw new UnsupportedOperationException("empty collection")
}
}
回答:はい、推測できます。パーティション化は、入力が読み取られた順序を変更しません。
したがって、どちらも同じように見えますが、違いがあります。
1.ファイルからデータを読み取るとき、デフォルトではRDDであり、RDDにはfirst()
属性とtake()
属性の両方があります。
2。first()
属性は行型オブジェクトを返し、take()
属性はリスト型を返します。
しかし、.toDF()
を使用してRDDをDataFrameに変換するとすぐに、そのDFにはfirst()
属性がありません。
概念がさらに明確になることを願っています。