Apache spark apachespark:意外的筛选结果

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(

我正在本地模式下使用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()时,该数字是两个值的总和,即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