cache()不能与collect()一起使用,但可以使用take(...)

时间:2015-07-22 18:59:01

标签: apache-spark apache-spark-sql

我正在尝试将DataFrame缓存到内存中。当我在collect()之后使用cache()时,DataFrame永远不会缓存在内存中。但是当我使用take(N)时,DataFrame会缓存在内存中。

我想知道为什么我在调用DataFrame时无法缓存collect()?以下是使用collect()和&的示例。 take()

使用collect()

cache()行为

scala> val hc = new org.apache.spark.sql.hive.HiveContext(sc)
scala> hc.sql("select * from sparkdb.firsttable").cache()
       res0: org.apache.spark.sql.DataFrame = [name: int]
scala> res0.collect()
       res1: Array[org.apache.spark.sql.Row] = Array([12], [13], [14], [15])

enter image description here

如您所见,在这种情况下,DataFrame未缓存。我希望在执行DataFrame action

时缓存collect() 使用take(N)

缓存()行为

scala> res0.take(30)
       res2: Array[org.apache.spark.sql.Row] = Array([12], [13], [14], [15])

enter image description here

如您所见,调用take(N)会将DataFrame缓存到内存中。

PS:以下是其他一些补充信息

收集()后的存储信息

scala> sc.getRDDStorageInfo
res2: Array[org.apache.spark.storage.RDDInfo] = Array()

take()后的存储信息

scala> sc.getRDDStorageInfo
       res3: Array[org.apache.spark.storage.RDDInfo] = 
       Array(RDD "HiveTableScan [name#0], (MetastoreRelation sparkdb, 
       firsttable, None), None
" (3) StorageLevel: StorageLevel(false, true, false, true, 1); 
CachedPartitions: 1; TotalPartitions: 1; MemorySize: 256.0 B; 
ExternalBlockStoreSize: 0.0 B; DiskSize: 0.0 B)

0 个答案:

没有答案