比较 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 并选择另一列的值

使用数据框的子集和 spark/scala 中的两个特定字段过滤数据框 [关闭]

Scala - 基于 Spark 中的键合并两个 RDD

scala 如何读取 csv 文件

scala 如何读取 csv 文件