使用正则表达式来解决Spark中的推特数量(Scala)

时间:2018-04-26 13:11:52

标签: regex scala apache-spark

我是Spark的新手。我想使用这个test.txt文件输出前2个twitter提及:

"我喜欢和@Kelsey一起跳舞,特别是和@Kelsey一起跳舞!"

"不相信你去了@harvard。拜托男人@ harvard"

"我喜欢@ harvard"

基本上,一条推文中的多次提及只计算一次。所以输出就像:

(2, @harvard)

(1, @Kelsey)

到目前为止,我的代码如下所示:

val tweets = sc.textFile("testFile")

val myReg = """(?<=@)([\\w]+)""".r

val mentions = tweets.filter(x => (myReg.pattern.matcher(x).matches))

但是,它不起作用,因为x仍然是一条线,因此不会匹配。无论如何,我可以测试行中的单词而不是行本身吗?另外,如何在推文中检查提及是否多余?

2 个答案:

答案 0 :(得分:0)

我调整了你的正则表达式,你可能需要将它转换回spark语法,但这样你就可以找到所有提及并将它们分组。 .toSet对于删除重复项很重要,.toLowercase在那里也有意义

  val tweets = List("I love to dance @Kelsey, especially with you @Kelsey!",
                "Can't believe you went to @harvard. Come on man @harvard",
                "I love @harvard")


  val myReg = """(@\w+)""".r

  val mentions = tweets.flatMap(x => myReg.findAllIn(x).toSet).groupBy(identity).mapValues(_.length)

  println(mentions)

答案 1 :(得分:0)

这对我有用,正则表达式更准确的镊子

val myReg = "(^|[^@\\w])@(\\w{1,15})\\b".r

val mentions = tweets.flatMap(x => myReg.findAllIn(x).matchData.map(_.group(0).trim -> 1)).reduceByKey(_ + _)