Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala映射过滤方法_Scala_Apache Spark_Filter_Rdd - Fatal编程技术网

Scala映射过滤方法

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

我是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)
 }
}
它可以工作,但我想知道是否有一种方法可以使用过滤器功能。我必须在我的程序中使用它,但我不知道如何在所有行之间迭代,并使用循环移除重复项

如果有人有主意,那就太好了

谢谢大家!

我认为使用过滤器来实现这一点并不是一个非常有效的解决方案。对于每个元素,您必须查看该元素是否已经存在于某种临时数据集中,或者计算这些元素中有多少在已处理的数据集中

如果您想对其进行迭代并可能进行一些动态编辑,您可以应用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一样。你是最好的!谢谢: