years.cache()
を呼び出すと、次にアクションが実行されたときにキャッシュされるのはyears
となります。
RDD.cacheは、ストレージレベルがMEMORY_ONLY
です。
キャッシュ():RDD.this.typeは、デフォルトのストレージ・レベル(MEMORY_ONLY)と、このRDDを持続。
スカーラ> years.getStorageLevel.useMemory res14:ブール=真
それ単に「クエリ」属性のあなたに次のコードを実行するときに、あなたがtrue
を取得し、なぜ答えを与える
MEMORY_AND_DISK
ストレージレベルとは、years
が実際にキャッシュされているかどうか、またはキャッシュされようとしているかどうかはわかりません。
私は、データセットがすでにキャッシュされているかどうかを知るには非常に深く考えなければならないと思います。
最も簡単な解決策は、SparkListener
APIとインターセプトSparkListenerBlockUpdatedを使用することですが、以前は行っていないと思います。
以下は、関連性のあるデータセットAPIについてのものです(データセットAPIに関する質問に間違いがあります)。
は、記憶レベルがであるため、必要に応じてメモリとディスクを使用します。
キャッシュ():Dataset.this.typeは、デフォルトのストレージ・レベル(MEMORY_AND_DISK
)と、このデータセットを永続化します。
scala> years.getStorageLevel.useMemory
res14: Boolean = true
それは単に「クエリ」MEMORY_AND_DISK
ストレージレベルとの属性がyears
が実際にあったかどうかを教えてくれません。次のコードを実行するときに、あなたがtrue
を取得し、なぜあなたに答えを与える
既にキャッシュされているか、まもなくなる。
データセットがすでにはキャッシュされるようにマークされているかどうかを確認するためには、(それがSharedState
を通じてSparkSessions
全体で共有し、spark.sharedState.cacheManager
として利用される)CacheManager
を使用することができます。
内部APIなので注意して使用してください。実際のところ
val cached = spark.range(5).cache
scala> spark.sharedState.cacheManager.lookupCachedData(cached.queryExecution.logical)
res20: Option[org.apache.spark.sql.execution.CachedData] =
Some(CachedData(Range (0, 5, step=1, splits=Some(8))
,InMemoryRelation [id#331L], true, 10000, StorageLevel(disk, memory, deserialized, 1 replicas)
+- *Range (0, 5, step=1, splits=8)
))
あなたが二回データセットと同じ(の論理的な計画)をキャッシュしようとした場合、CacheManager
はあなたに警告します。
scala> val cached = spark.range(5).cache
17/12/07 15:00:34 WARN CacheManager: Asked to cache already cached data.
cached: org.apache.spark.sql.Dataset[Long] = [id: bigint]
少なくとも1回計算されるまでキャッシュされません。アクションを呼び出します。 'years.first'を使い、Storageタブをチェックしてください。 – philantrovert
しかし、years.getStorageLevel.useMemoryコマンドはtrueを返します。それがキャッシュされていることを指定していませんか? – KayV
キャッシュされていることを指定しますが、アクションを呼び出さない限り実際にキャッシュには表示されません。これは 'sc.textFile'を使うときと同じように動作するRDDを取得しますが、アクションが含まれていない限り、マテリアライズされません。レイジー評価FTW。 – philantrovert