Scala ApacheSpark-生成对列表
给定一个包含以下格式数据的大文件,(V1,V2,…,VN) 我正在尝试使用Spark获得一个与以下类似的配对列表Scala ApacheSpark-生成对列表,scala,mapreduce,apache-spark,Scala,Mapreduce,Apache Spark,给定一个包含以下格式数据的大文件,(V1,V2,…,VN) 我正在尝试使用Spark获得一个与以下类似的配对列表 ((2,5),2) ((2,8),2) ((2,9),1) ((8,9),1) ((5,8),1) 我尝试了回答一个问题时提到的建议,但我遇到了一些问题。比如说, val dataRead = sc.textFile(inputFile) val itemCounts = dataRead .flatMap(line => line.split(",")) .map(
((2,5),2)
((2,8),2)
((2,9),1)
((8,9),1)
((5,8),1)
我尝试了回答一个问题时提到的建议,但我遇到了一些问题。比如说,
val dataRead = sc.textFile(inputFile)
val itemCounts = dataRead
.flatMap(line => line.split(","))
.map(item => (item, 1))
.reduceByKey((a, b) => a + b)
.cache()
val nums = itemCounts.keys
.filter({case (a) => a.length > 0})
.map(x => x.trim.toInt)
val pairs = nums.flatMap(x => nums2.map(y => (x,y)))
我弄错了
scala> val pairs = nums.flatMap(x => nums.map(y => (x,y)))
<console>:27: error: type mismatch;
found : org.apache.spark.rdd.RDD[(Int, Int)]
required: TraversableOnce[?]
val pairs = nums.flatMap(x => nums.map(y => (x,y)))
^
scala>val pairs=nums.flatMap(x=>nums.map(y=>(x,y)))
:27:错误:类型不匹配;
找到:org.apache.spark.rdd.rdd[(Int,Int)]
必需:可遍历一次[?]
val pairs=nums.flatMap(x=>nums.map(y=>(x,y)))
^
有人能告诉我哪些地方我做得不对,或者有什么更好的方法可以达到同样的效果?非常感谢。我不确定是否得到了您需要的,我使用滑动窗口从每行中提取数对,例如从第2,8,9行中,我提取了2对:(2,8)和(8,9)。如果您需要其他对提取,则需要将滑动(2)更新为其他内容
val dataRead = sc.textFile(this.getClass.getResource("/text.txt").getFile)
// Extract tuples from each line
val tuples: RDD[(Int, Int)] = dataRead.flatMap(_.split(",").sliding(2)).map {
case Array(l, r) => (l.toInt, r.toInt)
}
val count = tuples.countByValue()
count.foreach(println)
输出
((2,5),2)
((8,9),1)
((5,8),1)
((2,8),1)
您可以使用数组的组合方法来实现此目标
val dataRead = sc.textFile(inputFile)
// "2,5"
// "2,8,9"
// "2,5,8"
// ...
val combinations = dataRead.flatMap { line =>
line.split(",") // "2,8,9" => Array(2,8,9)
.combinations(2) // Iterator
.toSeq // ~ Array(Array(2,8), Array(2,9), Array(8,9))
.map{ case arr => arr(0) -> arr(1) } // Array((2,8), (2,9), (8,9))
}
// Array((2,5), (2,8), (2,9), (8,9), (2,5), (2,8), (5, 8), ...)
val result = combinations.map(item => item -> 1) // Array(((2,5),1), ((2,9),1), ...)
.reduceByKey(_ + _)
// Array(((2,5),2), ((2,8),2), ((2,9),1), ((8,9),1), ((5,8),1) ....)
// order may be different.
基本上,您正在尝试将
(Int,Int)
作为键,而不是字符串
,这是常见的示例
因此,这里的目标是将行转换为(Int,Int)
元组:
val pairs = sc.textFile(inputFile)
.map(line => line.split(","))
.flatMap(a => a.sliding(2))
.map(a => (a(0).toInt, a(1).toInt) -> 1)
.reduceByKey(_ + _)
您可以通过滑动2个间隔来提取单词对。有些句子只能有一个单词,因此在map函数中必须有适当的匹配大小写
val mapRdd = sc.textFile("inputFile.csv")
.map { line => line.split(" ") }
.flatMap { wordList => wordList.sliding(2) }
.map {
case Array(word1, word2) => ((word1, word2), 1)
case Array(word1) => ((word1, ""), 1)
}
.reduceByKey(_ + _)
println("===================================================")
mapRdd.foreach { li =>
println(li._1.toString() + " ---> " + li._2)
//println(li.sliding(2).foreach(li => println(li.toList)))
}
工作得很好!非常感谢。
val mapRdd = sc.textFile("inputFile.csv")
.map { line => line.split(" ") }
.flatMap { wordList => wordList.sliding(2) }
.map {
case Array(word1, word2) => ((word1, word2), 1)
case Array(word1) => ((word1, ""), 1)
}
.reduceByKey(_ + _)
println("===================================================")
mapRdd.foreach { li =>
println(li._1.toString() + " ---> " + li._2)
//println(li.sliding(2).foreach(li => println(li.toList)))
}