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(",")))