scala哈希集包含重复项

scala哈希集包含重复项,scala,apache-spark,duplicates,hashset,Scala,Apache Spark,Duplicates,Hashset,我有一个可变的hashset,我在其中添加了文本文件中的元素,但也添加了重复的元素。 我的代码是 val machines = new mutable.HashSet[String] val splitRdd = textFile.flatMap(line => { val l =line.split("\\t").toList machines.add(l(2)) machines}) splitRdd.foreach(rdd=> println(rdd)) splitRdd.

我有一个可变的hashset,我在其中添加了文本文件中的元素,但也添加了重复的元素。 我的代码是

val machines = new mutable.HashSet[String]

val splitRdd = textFile.flatMap(line => {
val l =line.split("\\t").toList
machines.add(l(2))
machines})

splitRdd.foreach(rdd=> println(rdd))
splitRdd.saveAsTextFile(outputFile)
文本文件是:

0   0   m2  0   0   0  
0   0   m2  0   0   0  
0   0   m3  0   0   0  
0   0   m3  0   0   0  
我在spark的输出文件和标准输出中得到的是:

m2  
m2  
m2  
m3  
m3

除了添加了重复项之外,还有一个文件中不存在的“m2”。我认为我的代码是正确的,有人知道为什么会这样吗?

嗯,看起来你跳过了(简短但强烈推荐的讲座)。特别是一节称为:

Spark最困难的事情之一是理解在集群中执行代码时变量和方法的范围和生命周期。修改超出其范围的变量的RDD操作经常会引起混淆

长话短说,Spark中没有共享内存(不要将共享内存与所谓的、实际上并没有共享的内存混淆)。您的代码执行以下操作:

  • 它检测到
    机器
    在封口内使用
  • 序列化值,发送到每个执行器节点,并反序列化以创建本地副本
  • 然后您的代码修改这个本地副本,每个执行器线程独立于其他线程工作。不涉及同步,所以您所做的只是删除单个分区的重复数据
您的代码可能在
本地
模式下工作(具体取决于声明
机器
的确切上下文),但一般来说,您应该看到驱动程序副本从未被修改,并且在执行代码后它是空的

您在这里真正应该做的是:

textFile.flatMap(_.split("\\t")).distinct.saveAsTextFile(outputFile)
这样Spark将消除单个分区的重复数据,洗牌数据以确保剩余的重复数据驻留在相同的分区上,然后复制分区


这里的外卖信息只是阅读手册。这将在将来节省很多麻烦。

好吧,看起来你跳过了(简短但强烈推荐的讲座)。特别是一节称为:

Spark最困难的事情之一是理解在集群中执行代码时变量和方法的范围和生命周期。修改超出其范围的变量的RDD操作经常会引起混淆

长话短说,Spark中没有共享内存(不要将共享内存与所谓的、实际上并没有共享的内存混淆)。您的代码执行以下操作:

  • 它检测到
    机器
    在封口内使用
  • 序列化值,发送到每个执行器节点,并反序列化以创建本地副本
  • 然后您的代码修改这个本地副本,每个执行器线程独立于其他线程工作。不涉及同步,所以您所做的只是删除单个分区的重复数据
您的代码可能在
本地
模式下工作(具体取决于声明
机器
的确切上下文),但一般来说,您应该看到驱动程序副本从未被修改,并且在执行代码后它是空的

您在这里真正应该做的是:

textFile.flatMap(_.split("\\t")).distinct.saveAsTextFile(outputFile)
这样Spark将消除单个分区的重复数据,洗牌数据以确保剩余的重复数据驻留在相同的分区上,然后复制分区


这里的外卖信息只是阅读手册。这将在将来节省很多麻烦。

什么是机器?你能更新代码吗?机器是m2、m3相加的哈希集,但输出是
splitRdd.foreach(rdd=>println(rdd))
,它不是哈希集,而是rdd的元素。在文本文件中保存的是
splitRdd.saveAsTextFile(outputFile)
,而不是散列集。那么,您如何知道哈希集有重复项呢?新的rdd与哈希集不一样吗?我想如果把它退回,也会是一样的。还有,我试着打印机器,但什么也没打印什么是机器?你能更新代码吗?机器是m2、m3相加的哈希集,但输出是
splitRdd.foreach(rdd=>println(rdd))
,它不是哈希集,而是rdd的元素。在文本文件中保存的是
splitRdd.saveAsTextFile(outputFile)
,而不是散列集。那么,您如何知道哈希集有重复项呢?新的rdd与哈希集不一样吗?我想如果把它退回,也会是一样的。还有,我试着打印机器,但什么也没打印好,我读过,但好像我错过了很多东西。我会再读一遍。非常感谢。嗯,我读过,但似乎我错过了很多东西。我会再读一遍。非常感谢。