これが発生する理由は、キャッシュがスパークでどのように動作するかに起因します。あなたにqueryExecution
復帰計画
val df = sc.parallelize(1 to 10000).toDF("line")
df.withColumn("new_line", col("line") * 10).queryExecution
をコマンドを:あなたは、実行計画は以下を参照しているDATAFRAME、RDDまたはDataSetにプロセスのいくつかの種類を呼び出す
。コードの下の論理プランを参照してください。
== Parsed Logical Plan ==
Project [*,('line * 10) AS new_line#7]
+- Project [_1#4 AS line#5]
+- LogicalRDD [_1#4], MapPartitionsRDD[9] at
== Analyzed Logical Plan ==
line: int, new_line: int
Project [line#5,(line#5 * 10) AS new_line#7]
+- Project [_1#4 AS line#5]
+- LogicalRDD [_1#4], MapPartitionsRDD[9] at
== Optimized Logical Plan ==
Project [_1#4 AS line#5,(_1#4 * 10) AS new_line#7]
+- LogicalRDD [_1#4], MapPartitionsRDD[9] at intRddToDataFrameHolder at
== Physical Plan ==
Project [_1#4 AS line#5,(_1#4 * 10) AS new_line#7]
+- Scan ExistingRDD[_1#4]
この場合、コードで実行されるすべてのプロセスが表示されます。あなたはこのようなcache
関数を呼び出すとき:
df.withColumn("new_line", col("line") * 10).cache().queryExecution
を結果は次のようになります。
== Parsed Logical Plan ==
'Project [*,('line * 10) AS new_line#8]
+- Project [_1#4 AS line#5]
+- LogicalRDD [_1#4], MapPartitionsRDD[9] at intRddToDataFrameHolder at <console>:34
== Analyzed Logical Plan ==
line: int, new_line: int
Project [line#5,(line#5 * 10) AS new_line#8]
+- Project [_1#4 AS line#5]
+- LogicalRDD [_1#4], MapPartitionsRDD[9] at intRddToDataFrameHolder at <console>:34
== Optimized Logical Plan ==
InMemoryRelation [line#5,new_line#8], true, 10000, StorageLevel(true, true, false, true, 1), Project [_1#4 AS line#5,(_1#4 * 10) AS new_line#8], None
== Physical Plan ==
InMemoryColumnarTableScan [line#5,new_line#8], InMemoryRelation [line#5,new_line#8], true, 10000, StorageLevel(true, true, false, true, 1), Pro...
この実行は、これが保存されます、あなたにoptmized論理的計画のInMemoryRelation
の実行を返します。あなたのメモリ内のデータの構造、またはあなたのデータが本当に大きい場合、それはディスクにこぼれるでしょう。
これをクラスタに保存する時間は、最初の実行では少し遅くなりますが、DFまたはRDDが保存される別の場所で同じデータに再びアクセスする必要がある場合は、スパークは再び実行を要求しません。
こんにちは、ご意見ありがとうございます。実際には、私がパーケットにデータを書き込む前に、再分割操作を行います。また、上記のクエリを再分割してテストしたところ、クエリ時間が20秒の方が効率的でしたが、キャッシングなしでパーケットファイルから読み取るよりも遅いです。私の目的は、寄せ木細工のファイルに書くのを避けることです。何らかのソースを提供できますか?キャッシュ後にパーティションプルーニングがサポートされていないことをどのように知っていますか?ここで答えを書くなら、それを受け入れることができます。 –
修正、メモリ内のキャッシュはクエリ時間を1秒未満に短縮しますが、これは当然受け入れられます。私はそれがスケールかどうか疑問に思う:これは私のdastaの一部であり、私は実際には200倍以上の連続成長をしているので、私が持っているデータが多くなればなるほど、 。 –