2017-12-11 7 views
0
var df = List(1,2,3,4,5,6,7,8,9,10,11).toDF("num") 
df.show() 
var df2 = df.limit(3) 
df2.show() 
var df3 = df.except(df2) 
df3.show() 

驚くべきことに、私はそれ以外の方法がそれを行うべきではないことを発見しました。ここに私の出力です: df2:正しく作成され、1,2,3が含まれています。しかし、私のdf3はまだそれに1,2、および/または3を持っています。それは一種のものです。私が複数回それを実行すると、私は別の結果を得る。誰でも助けてくれますか?前もって感謝します。Spark DataFrameの `except()`は、毎回異なるアイテムを削除します

+1

は奇数、私は一貫性のある(予想される)の結果を取得しています。使用しているSparkのバージョンは何ですか?また、「クラスタマネージャ」(マスター/ローカル/ YARN /スタンドアロンなど)は何ですか? –

+0

varは使用しません。可能な限りvalを使用してみてください。 –

+0

これはスパークの仕組みを理解する良い例ではありません。 limit(3)が1,2,3を返すと仮定することはできません。これは3つの要素を返しますが、異なるマシンから収集することができます。この機能をテストする場合は、異なるデータフレームを作成してください。 – marios

答えて

3

「例外」操作を実行する前に「df2」に必要なデータを収集するためにスパーク「アクション」を入れる必要があります。これにより、データフレームdf2が手前で計算され、 dfから差し引かれます。

ランダムなのは、スパーク遅延評価とスパークがすべてのコードを1つのステージに入れているからです。また、「df2」の内容は、「例外」操作を実行したときに修正されません。制限のためのスパーク関数の定義に従って:

最初のn行を取って新しいデータセットを返します。この関数 とheadの違いは、headがアクションであり、クエリの実行をトリガーすることによって配列を返します。 limitは新しいデータセットを返します。 、それはDATSETを返す

いるので、遅延評価されるコードの下

はあなたに一貫性のある出力が得られます。これをテストする

var df = List(1,2,3,4,5,6,7,8,9,10,11).toDF("num") 
df.show() 
var df2 = df.head(3).map(f => f.mkString).toList.toDF("num") 
df2.show() 
var df3 = df.except(df2) 
df3.show() 
+0

Spark/Scalaでコーディングする際には非常に注意する必要があるようです。行動を示していないのですか?私は前にショーを行った。そして、異なる実行でdf2が異なっていても、なぜdf3の要素が同時に存在するのでしょうか?コードが順番に実行されないことを意味しますか? –

0

ベストな方法は、ちょうどあなたがdiffをしたい値を持つ新しいDFを作成することです。

val df = List(1,2,3,4,5,6,7,8,9,10,11).toDF("num") 
df.show() 
val df2 = List(1,2,3).toDF("num") 
df2.show() 
val df3 = df.except(df2) 
df3.show() 

また、ちょうどあなたがしたい行を選択し、決定論的フィルタを書く:

val df = List(1,2,3,4,5,6,7,8,9,10,11).toDF("num") 
df.show() 
val df2 = df.filter("num <= 3") 
df2.show() 
val df3 = df.except(df2) 
df3.show() 
+0

ありがとうございます。しかし、これで私の最終的な目的は解決されません。私はループの中で一種のポップタイプの操作が必要です。私の最終的な目的は、1,2,3のみを選択することではありません。 –

+0

RDDまたはデータフレームをあらかじめ定義された順序で1つのコレクションとして参照すると、問題が発生します。私は限界コードがSparkでどのように実装されているかを調べました。ソートを適用した場合など注文操作がない限り、結果のデータフレームの順序はかなりランダムになります。 Sparkの実装について詳しく調べたい場合は、https://github.com/apache/spark/blob/master/sql/core/src/main/scala/org/apache/spark/sql/execution/limitを参考にしてください。 scala – marios

+0

私はあなたの時間と労力を感謝します。私の問題は、実際にはアイテムが拾われる順序ではありません。私は例として整数のリストを与えた。無作為に選んでも例外はありませんが、無作為に選ばれたアイテムが除外されていることを確認しても問題はありません。たとえば、それは4,8と9を選ぶかもしれません。しかしdf3は{1,2,3,5,6,7,10,11}でなければなりません。それは私にとって重要ではない(11,1,2,3,10,5,6,7)ことができます。私は一種のポップが必要だと言いましたが、スタック内のLIFOプリンシパルに正確にポップしません。それでも私はshow()を呼び出すと、それはアクション項目ではないのですか? –

関連する問題