比较 Scala 和 Spark 中的两个文件内容
Posted
技术标签:
【中文标题】比较 Scala 和 Spark 中的两个文件内容【英文标题】:Compare two files content in Scala and Spark 【发布时间】:2015-05-12 14:40:06 【问题描述】:我想将文件中的每个单词与外部单词列表进行比较,请看这个例子:
我的数据文件是:
surprise heard thump opened door small seedy man clasping package wrapped.
upgrading system found review spring 2008 issue moody audio mortgage backed.
omg left gotta wrap review order asap . understand hand delivered dali lama
speak hands wear earplugs lives . listen maintain link long .
buffered lightning thousand volts cables burned revivification place .
cables cables finally able hear auditory gem long rumored music .
...
外文文件是:
thump,1
man,-1
small,-1
surprise,-1
system,1
wrap,1
left,1
lives,-1
place,-1
lightning,-1
long,1
...
比较这些词时,如果每个文档中的某些词与外部词相同,则将它们的值相加,最后每个文档都有一个分数 预期的输出是:
-2 ; surprise heard thump opened door small seedy man clasping package wrapped.
1 ; upgrading system found review spring 2008 issue moody audio mortgage backed.
2 ; omg left gotta wrap review order asap . understand hand delivered dali lama
0 ; speak hands wear earplugs lives . listen maintain link long .
-2 ; buffered lightning thousand volts cables burned revivification place .
1 ; cables cables finally able hear auditory gem long rumored music .
...
我试过了:
object test
def main(args: Array[String]): Unit =
val conf = new SparkConf().setAppName("prep").setMaster("local")
val sc = new SparkContext(conf)
val searchList = sc.textFile("data/words.txt")
val sentilex = searchList.map( (line) =>
val Array(a,b) = line.split(",").map(_.trim)
(a,b.toInt)
).collect().toVector
val lex=sentilex.map(a=>a._1)
val lab=sentilex.map(b=>b._2)
val sample1 = sc.textFile("data/data.txt")
val sample2 = sample1.map(line=>line.split(" "))
val sample3 = sample2.map(elem => if (lex.contains(elem)) ("1") else elem)
sample3.foreach(println)
谁能帮帮我?
【问题讨论】:
【参考方案1】:嗨,我认为做你想做的最好的方法是使用广播值来发送标记,然后使用映射函数来计算总和。在代码中会是这样的:
object test
def main(args: Array[String]): Unit =
val conf = new SparkConf().setAppName("prep").setMaster("local")
val sc = new SparkContext(conf)
val searchList = sc.textFile("data/words.txt")
val sentilex = sc.broadcast(searchList.map( (line) =>
val Array(a,b) = line.split(",").map(_.trim)
(a,b.toInt)
).collect().toMap)
val sample1 = sc.textFile("data/data.txt")
val sample2 = sample1.map(line=>(line.split(" ").map(word => sentilex.value.getOrElse(word, 0)).reduce(_ + _), line))
sample2.collect.foreach(println)
希望对你有用
【讨论】:
谢谢@jlopezmat 的回复,我有一个问题,我怎样才能删除每个文档周围的括号,例如上面代码的一个输出是:(-2,惊讶地听到砰的一声打开门小破烂男人紧握包裹。) @Rozita 出现括号是因为您有元组,并且它的 toString 方法放置了括号。如果你想删除它们,你的代码应该是:sample2.collect.foreach(tuple => println(tuple._1+","+tuple._2))
我希望这会有用
亲爱的@jlopezmat,如果我想在评分后删除相同的单词,我该怎么做?
对不起@Rozita,但我不明白你的意思,你能给我一个你想做的例子吗?
例如我的数据中的第一行:“-2 ; 听到打开的门破旧的扣紧包装。”比较两个文件中的两个单词如果这些单词相同,则添加分数但删除该单词。
以上是关于比较 Scala 和 Spark 中的两个文件内容的主要内容,如果未能解决你的问题,请参考以下文章
编写Spark的WordCount程序并提交到集群运行[含scala和java两个版本]
Scala Spark,比较两个 DataFrame 并选择另一列的值