Scala查找两个列表之间的公共值

时间:2015-11-25 21:11:35

标签: scala apache-spark

我有一个以下格式的文本文件

a,b,c,d,e
f,g,h,i,j
b,g,k,l,m
g,h,o,p,q

我想要一个输出文件,其中只包含第一列中的值在第二列的任何一列中可用的那些行。例如,在这种情况下,最后两行的第一列中的值是" b"和" g"也可以在第二栏的某处获得。所以我所需的输出只有两行。

b,g,k,l,m
g,h,o,p,q

根据我的解决方案,我得到了两列具有不同值的第1列和第2列。现在,如何查看Column2中的列中的值是否可用。相关代码:

import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import org.apache.commons.io.IOUtils;
import scala.io.StdIn.{readLine, readInt}
import scala.io.Source

object SimpleApp {
  def main(args: Array[String]) {
    val logFile = "src/data/s1.txt"

    val sc = new SparkContext("spark://Hadoop1:7077", "Simple App", "/usr/local/spark",
    List("/usr/local/spark/SimpleSparkProject/target/scala-2.11/simple-project_2.11-1.0.jar"))
    val lD = sc.textFile(logFile).cache()

    val d2Map = lD map(col2)
    val Column2 = d2Map.distinct

    val d1Map = lD map(col1)
    val Column1 = d1Map.distinct

    // Now, here I want only those values in Column1 Which are available in Column2

    //Column2.saveAsTextFile("hdfs://Hadoop1:9000/user/output/distDestination")
  }




  def col2(s:String) : (String) = {
    val kv = s.split(",")
    val k = kv(1)
    k
  }

  def col1(s:String) : (String) = {
    val kv = s.split(",")
    val k = kv(0)
    k
  }

}

1 个答案:

答案 0 :(得分:0)

此代码用纯scala编写,不使用spark,但我希望它能帮到你。

val str = "a,b,c,d,e\n" +
  "f,g,h,i,j\n" +
  "b,g,k,l,m\n" +
  "g,h,o,p,q"

val rows = str.split("\n")
val splittedRows = rows.map(_.split(","))

val stringsInSecondColumn = splittedRows.map(_.apply(1)).toSet    

val result = splittedRows.filter { row =>
  stringsInSecondColumn.contains(row.apply(0))
}
result.foreach(x => println(x.mkString(",")))

上面的结果val stringsInSecondColumn只是字符串解析。 比我们在第二列中获取所有字符串并使用它们构建容器来设置以实现线性搜索时间。 而且我们只需要过滤所有行并检查是否可以在stringsInSecondColumn集中找到第一个值。

在您的代码中,您可以做以下事情:

val stringsInSecondColumn = lD.map(_.split(",")(1)).toSet
val filteredRows = lD.filter(row => stringsInSecondColumn.contains(row.split(",")(0)))

希望它会对你有所帮助。