私は(私は、Javaを使用していますので、実際にはデータセット)のテストスパークデータフレームにおもちゃのクラスを書きました。
Dataset<Row> ds = spark.sql("select id,name,gender from test2.dummy where dt='2018-12-12'");
ds = ds.withColumn("dt", lit("2018-12-17"));
ds.cache();
ds.write().mode(SaveMode.Append).insertInto("test2.dummy");
//
System.out.println(ds.count());
私の理解によると、2つのそこにいるアクションを、「insertInto」と「カウント」。
「insertInto」を実行しているとき、私は、私はいくつかの行を参照してください、ステップ、によって、コードのステップをデバッグします:
19/01/21 20:14:56 INFO FileScanRDD: Reading File path: hdfs://ip:9000/root/hive/warehouse/test2.db/dummy/dt=2018-12-12/000000_0, range: 0-451, partition values: [2018-12-12]
「カウント」を実行しているとき、私はまだ同様のログを参照してください。
19/01/21 20:15:26 INFO FileScanRDD: Reading File path: hdfs://ip:9000/root/hive/warehouse/test2.db/dummy/dt=2018-12-12/000000_0, range: 0-451, partition values: [2018-12-12]
私は2つの質問があります:
1)ときは上記のように同じデータフレームにそこにいる2つのアクション、私は明示的にds.cacheまたはds.persistを呼び出さない場合は、2番目のアクションは常にSQLクエリを再実行する原因となるのでしょうか?
私が正しくログを理解していれば2)、両方のアクションは、それが実際には、ここでは動作しません()ds.cacheを意味し、HDFSファイルの読み込みをトリガ?もしそうなら、なぜそれがここで働いていないのですか?
どうもありがとう。
あなたがテーブルに追加するので、それはだds
から作成されるので、ds
基になるデータが変更されたため、再計算する必要があります。このような場合には、スパークは、キャッシュを無効にします。あなたはこのJiraの(例えば読めばhttps://issues.apache.org/jira/browse/SPARK-24596を):
キャッシュを無効にすると、我々は最新の状態にあるキャッシュされたデータを確実にするために、このキャッシュに依存して他のキャッシュを無効。基本となるテーブルが変更されたか、テーブル自体を削除された場合、例えば、このテーブルを使用するすべてのキャッシュを無効化または更新する必要があります。
実行しようとするds.count
テーブルに挿入する前に。