遇到了一些关于过滤器的困惑。 RDD val的名称如下:
Array(Array('1239423', '42132'), Array('245123', '32412'), ...)
第一个元素是用户ID,第二个元素是商品ID。
以及另一个val trainitemids_value中的有效项ID数组,如下所示:
Array('42132', '43123', ...)
我想使用此有效ID设置对单词应用过滤器。 据我了解,以下两种方法的输出数量应该相同:
val ids = words.map(line => line(1))
val re = ids.filter(line => trainitemids_value.contains(line))\
或
val re = words.filter(line => trainitemids_value.contains(line(1)))
但是实际上是不同的。方法1的数量有意义,因为它小于原始单词的数量。 与原始单词相比,方法2的结果数量要多得多。
我不明白filter的输出数量为什么会比原始集合大?
以下是我的控制台的原始输出:
scala> val ids = words.map(line => line(1))
ids: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[14] at map at <console>:28
scala> val re = ids.filter(line => validID.contains(line))
re: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[15] at filter at <console>:42
scala> re.count()
res4: Long = 42548
scala> val re2 = words.filter(line => validID.contains(line(1)))
re2: org.apache.spark.rdd.RDD[Array[String]] = MapPartitionsRDD[16] at filter at <console>:40
scala> re2.count()
res5: Long = 2448569
scala> words.count()
res6: Long = 42549
根据@vindev的回答,我尝试将RDD单词缓存。现在的结果看起来很合理。我仍然不完全了解原因。 解决方法如下:
scala> val cached = words.cache
cached: words.type = MapPartitionsRDD[13] at map at <console>:26
scala> cached.count()
res7: Long = 42549`
scala> val re3 = cached.filter(line => validID.contains(line(1)))
re3: org.apache.spark.rdd.RDD[Array[String]] = MapPartitionsRDD[17] at filter at <console>:42
scala> re3.count()
res8: Long = 42548