Scala映射过滤方法
我是Scala和Spark的新手。我正在尝试删除文本文件的重复行。 每行包含三列向量值,例如:-4.5、-4.2,2.7 这是我的节目:Scala映射过滤方法,scala,apache-spark,filter,rdd,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
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)
}
}
它可以工作,但我想知道是否有一种方法可以使用过滤器功能。我必须在我的程序中使用它,但我不知道如何在所有行之间迭代,并使用循环移除重复项
如果有人有主意,那就太好了
谢谢大家! 我认为使用过滤器来实现这一点并不是一个非常有效的解决方案。对于每个元素,您必须查看该元素是否已经存在于某种临时数据集中,或者计算这些元素中有多少在已处理的数据集中
如果您想对其进行迭代并可能进行一些动态编辑,您可以应用map,然后使用reduceByKey对相同的元素进行分组。像这样
val singleKeys =
keys
.map( element => ( element , 0 ) )
.reduceByKey( ( element, count ) => element )
.map( _._1 )
您可以在其中对第一个映射部分中的数据集进行更改。虽然根据reduceByKey的定义,我们需要在元组或映射中使用第二个参数,但不使用count参数
我认为这基本上就是distinct内部工作的方式。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
谢谢!!但我想保留所有重复元素的一个实例。是否可能?是的,如果删除筛选条款。结果将和distinct一样。你是最好的!谢谢: