微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

getPersistentRDDs 在 Spark 2.2.0 中返回缓存的 RDD 和数据帧的映射,但在 Spark 2.4.7 中 - 它仅返回缓存的 RDD 的映射

如何解决getPersistentRDDs 在 Spark 2.2.0 中返回缓存的 RDD 和数据帧的映射,但在 Spark 2.4.7 中 - 它仅返回缓存的 RDD 的映射

如果在 Spark 2.2.0 版中缓存 RDD 和 DataFrame getPersistentRDDs 返回 Map size 2:

scala> val rdd = sc.parallelize(Seq(1))
rdd: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[0] at parallelize at <console>:24

scala> val df = sc.parallelize(Seq(2)).toDF
df: org.apache.spark.sql.DataFrame = [value: int]

scala> spark.sparkContext.getPersistentRDDs
res0: scala.collection.Map[Int,org.apache.spark.rdd.RDD[_]] = Map()

scala> df.cache
res1: df.type = [value: int]

scala> spark.sparkContext.getPersistentRDDs
res2: scala.collection.Map[Int,org.apache.spark.rdd.RDD[_]] =
Map(4 -> *SerializefromObject [input[0,int,false] AS value#2]
+- Scan ExternalRDDScan[obj#1]
 MapPartitionsRDD[4] at cache at <console>:27)

scala> rdd.cache
res3: rdd.type = ParallelCollectionRDD[0] at parallelize at <console>:24

scala> spark.sparkContext.getPersistentRDDs
res4: scala.collection.Map[Int,org.apache.spark.rdd.RDD[_]] =
Map(0 -> ParallelCollectionRDD[0] at parallelize at <console>:24,4 -> *SerializefromObject [input[0,false] AS value#2]
+- Scan ExternalRDDScan[obj#1]
 MapPartitionsRDD[4] at cache at <console>:27)

但在 Spark 2.4.7 版本中 getPersistentRDDs 返回 Map size 1

...
scala> spark.sparkContext.getPersistentRDDs
res4: scala.collection.Map[Int,org.apache.spark.rdd.RDD[_]] = Map(0 -> ParallelCollectionRDD[0] at parallelize at <console>:24)

以及如何获取所有缓存对象而不仅仅是 RDD 的问题 那个开始表现不同的方法突然发生了什么?

解决方法

数据帧实际上并未缓存在内存中,因为尚未对数据帧执行任何操作,因此将其从 db.getCollection('CustomerInfo').update( { "oid.c": 1260351143035 },{ $push: { "sessions": { "asessionID":"test123" } } } ) 的结果中排除实际上是公平的。我认为更高版本中的行为实际上是可取的。但是一旦你对dataframe做了一些事情,它就会被缓存,并且会出现在getPersistentRDDs的结果中,如下图:

getPersistentRDDs

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。