我是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仍然是一条线,因此不会匹配。无论如何,我可以测试行中的单词而不是行本身吗?另外,如何在推文中检查提及是否多余?
答案 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(_ + _)