Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.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 - Fatal编程技术网

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

Scala查找两个列表之间的公共值,scala,apache-spark,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的列表,它们具有不同的值。现在,如何查看第1列中的值在第2列中是否可用。相关代码: import org.apache.spar

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

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的列表,它们具有不同的值。现在,如何查看第1列中的值在第2列中是否可用。相关代码:

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
  }

}

这段代码是用纯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(",")))
result val stringsInSecondColumn上面的行只是字符串解析。 然后我们得到第二列中的所有字符串,并使用它们来设置容器,以实现线性搜索时间。 然后,我们只需要过滤所有行,并检查是否可以在stringsInSecondColumn集合中找到第一个值

在代码中,您可以执行以下操作:

val stringsInSecondColumn = lD.map(_.split(",")(1)).toSet
val filteredRows = lD.filter(row => stringsInSecondColumn.contains(row.split(",")(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(",")))
result val stringsInSecondColumn上面的行只是字符串解析。 然后我们得到第二列中的所有字符串,并使用它们来设置容器,以实现线性搜索时间。 然后,我们只需要过滤所有行,并检查是否可以在stringsInSecondColumn集合中找到第一个值

在代码中,您可以执行以下操作:

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

希望对您有所帮助。

您尝试过哪些方法?请发布您一直在使用的代码,以便我们知道如何进一步帮助您。请参阅我编辑的问题关于scala>List(“b”、“g”、“k”、“l”、“m”)。intersect(List(“g”、“h”、“o”、“p”、“q”))res4:List[String]=List(g)您尝试过哪些方法?请发布您一直在使用的代码,以便我们知道如何进一步帮助您。请参阅我编辑的问题关于
scala>列表(“b”、“g”、“k”、“l”、“m”)。相交(列表(“g”、“h”、“o”、“p”、“q”))res4:List[String]=List(g)
根据您的建议,我在上述代码中添加了以下部分,但我得到了下面提到的错误val lD=sc.textFile(logFile.cache()val splittedRows=lD.map(.split(“,”))val stringsInSecondColumn=splittedRows.map(.apply(1)).toSet错误:value-toSet不是org.apache.spark.rdd.rdd[String]的成员@Ahmad尝试使用distinct而不是toSet。我以前从未使用过Spark,也不知道它是api。根据他们的api,disctict应该有帮助。根据您的建议,我在上面的代码中添加了以下部分,但我得到了下面提到的错误val lD=sc.textFile(logFile).cache()val splittedRows=lD.map(.split(,“”)val stringsInSecondColumn=splittedRows.map(.apply(1)).toSet错误:值toSet不是org.apache.spark.rdd.rdd[String]@Ahmad的成员。请尝试使用distinct而不是toSet。我以前从未使用过Spark,也不知道它是api。根据他们的api说明,这应该有帮助。
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(",")))