Apache spark apachespark:意外的筛选结果
我正在本地模式下使用ApacheSparkV1.2。我已经创建了一个RDD并将其保存在内存中。Spark Web UI显示此RDD的85%存储在内存中。我在RDD中有一个特性/变量,其值为0,1,运行以下脚本得到的结果表明了这一点:Apache spark apachespark:意外的筛选结果,apache-spark,filter,rdd,Apache Spark,Filter,Rdd,我正在本地模式下使用ApacheSparkV1.2。我已经创建了一个RDD并将其保存在内存中。Spark Web UI显示此RDD的85%存储在内存中。我在RDD中有一个特性/变量,其值为0,1,运行以下脚本得到的结果表明了这一点: In[96]: flagged.map(lambda x:(x[14],1)).reduceByKey(lambda x,y:x+y).collect() Out[96]: [(0, 637981), (1, 272958)] 此外,当我执行标记的.count(
In[96]: flagged.map(lambda x:(x[14],1)).reduceByKey(lambda x,y:x+y).collect()
Out[96]: [(0, 637981), (1, 272958)]
此外,当我执行标记的.count()时,该数字是两个值的总和,即637981+272958=910939
现在,当我基于此运行过滤器时,我不会得到相同的计数:
In[97]: flagged.filter(lambda x: x[14]==0).count()
Out[97]: 637344
In[97]: flagged.filter(lambda x: x[14]==1).count()
Out[97]: 272988
我很难理解为什么过滤后的RDD生成的数字与reduceByKey方法不匹配。使用缓存类型
内存和磁盘
rdd.persist(org.apache.spark.storage.StorageLevel.MEMORY_AND_DISK)
有一刻我觉得这是一个bug,我执行了一个示例作业,看起来你是对的
val count3 = sc.parallelize(1 to 1000000).map(r => {
(new java.util.Random().nextInt(2), 1)
})
count3.reduceByKey(_+_).collect
res10:Array[(Int,Int)]=数组((0500201),(1499799))
res13:Long=499613
count3.filter(r => r._1==1).count
res14:Long=500143
但后来我把代码改成了
val count3 = sc.parallelize(1 to 1000000).map(r => {
(new java.util.Random().nextInt(2), 1)
}).persist()
count3.count
请注意,这次我添加了persist(并且我能够缓存这个rdd的100%)
res27:Array[(Int,Int)]=数组((0500048),(1499952))
res28:Long=500048
count3.filter(r => r._1==1).count
res29:Long=499952
我认为您正在生成RDD,然后将其持久化,默认的缓存类型是内存\u ONLY
。现在的问题是,您只能在内存中缓存85%的rdd,这意味着剩余的15%将按需重新计算。如果您在创建rdd时使用了一些随机函数,那么在重新计算过程中,这15%的数据可能会发生变化。@FawadAlam请向上投票并选择此答案。谢谢
count3.reduceByKey(_+_).collect
count3.filter(r => r._1==0).count
count3.filter(r => r._1==1).count