Scala地图过滤方法

时间:2017-10-14 06:17:59

标签: scala apache-spark filter rdd

我是Scala和Spark的新手。我试图删除文本文件的重复行。 每行包含三列(矢量值),例如:-4.5,-4.2,2.7

这是我的计划:

import org.apache.spark.SparkContext
import org.apache.spark.SparkConf
import org.apache.spark.rdd.RDD
import scala.collection.mutable.Map

object WordCount {

 def main(args: Array[String]) {

   val conf = new SparkConf().setAppName("WordCount").setMaster("local[*]")
   val sc = new SparkContext(conf)
   val input =  sc.textFile("/opt/spark/WC/WC_input.txt")

   val keys = input.flatMap(line => line.split("/n"))

   val singleKeys = keys.distinct

   singleKeys.foreach(println)
 }
}

它有效,但我想知道是否有办法使用过滤功能。我必须在我的程序中使用它,但我不知道如何在所有行之间进行迭代并删除重复项(例如使用循环)。

如果有人有想法,会很棒!

谢谢!

2 个答案:

答案 0 :(得分:1)

我认为使用filter来做这件事并不是一个非常有效的解决方案。对于每个元素,您必须查看此元素是否已存在于某种临时数据集中,或者计算这些元素在处理的数据集中的数量。

如果您想迭代它并可能进行一些即时编辑,您可以应用map然后reduceByKey对相同的元素进行分组。喜欢这个

val singleKeys = 
    keys
    .map( element => ( element , 0 ) )
    .reduceByKey( ( element, count ) => element )
    .map( _._1 )

您可以在第一个map部分对数据集进行更改。虽然根据count的定义我们需要在元组或地图中使用第二个参数,但未使用reduceByKey参数。

我认为这基本上是distinct内部工作的方式。

答案 1 :(得分:0)

可以通过以下方式删除RDD的重复元素:

val data = List("-4.5,-4.2,2.7", "10,20,30", "-4.5,-4.2,2.7")
val rdd = sparkContext.parallelize(data)
val result = rdd.map((_, 1)).reduceByKey(_ + _).filter(_._2 == 1).map(_._1)
result.foreach(println)

结果:

10,20,30