web-dev-qa-db-ja.com

Spark RDDのtake(1)とfirst()の違い

rdd.take(1)rdd.first()はまったく同じだと思っていました。しかし、同僚が私に RDDに関するSparkの職務文書

first():このRDDの最初の要素を返します。

take(num):RDDの最初のnum要素を取得します。最初に1つのパーティションをスキャンし、そのパーティションの結果を使用して、制限を満たすために必要な追加のパーティションの数を推定します。

私の質問は:

  1. first()の基礎となる実装はtake(1)と同じですか?
  2. _rdd1_と_rdd2_が同じcsvから構築されていると仮定すると、rdd1.take(1)rdd2.first()は常に同じ結果、つまりcsv?の最初の行を返します。 _rdd1_と_rdd2_のパーティションが異なる場合はどうなりますか?
10
Ida

事実firsttakeの観点から実装されています。

以下は、 RDD.scala のsparkのソースから取られています。 firsttake(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番目のパーティションの最初の行を返します。

17
Pranav Shukla

両方は同じではありません。

rdd.first()はこのRDDの最初の要素を返し、rdd.take(1)は最初の要素のみを持つ配列を返します。

  1. First()の基礎となる実装は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. Rdd1とrdd2が同じcsvから構築されていると仮定すると、rdd1.take(1)とrdd2.first()は常に同じ結果、つまりcsvの最初の行を返すと安全に仮定できますか? rdd1とrdd2のパーティションが異なる場合はどうなりますか?

回答:はい、推測できます。パーティション化は、入力が読み取られた順序を変更しません。

5
Amit Kumar

したがって、どちらも同じように見えますが、違いがあります。

1.ファイルからデータを読み取るとき、デフォルトではRDDであり、RDDにはfirst()属性とtake()属性の両方があります。
2。first()属性は行型オブジェクトを返し、take()属性はリスト型を返します。

しかし、.toDF()を使用してRDDをDataFrameに変換するとすぐに、そのDFにはfirst()属性がありません。

概念がさらに明確になることを願っています。

詳細については画像をご覧ください

0
Gaurav Sehrawat