我是Spark的新手。我想用这个test.txt文件输出推特上提到的前两个:
“我喜欢跳舞@凯尔西,尤其是和你跳舞@凯尔西!”
“真不敢相信你去了@哈佛。来吧,伙计@哈佛”
“我爱@哈佛”
从本质上讲,在一条推文中多次被提及只算一次。因此输出将如下所示:
(2, @harvard)
(1, @Kelsey)到目前为止,我的代码如下所示:
val tweets = sc.textFile("testFile")
val myReg = """(?<=@)([\\w]+)""".r
val mentions = tweets.filter(x => (myReg.pattern.matcher(x).matches))但是,它不会工作,因为x仍然是一条线,因此它不会匹配。有没有什么办法,我可以测试行中的单词,而不是行本身?另外,我如何检查推文中提到的内容是否多余?
发布于 2018-04-26 22:18:45
我稍微调整了您的正则表达式,您可能需要将其转换回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)发布于 2018-04-26 22:20:13
这对我来说很有效,正则表达式更精确。
val myReg = "(^|[^@\\w])@(\\w{1,15})\\b".r
val mentions = tweets.flatMap(x => myReg.findAllIn(x).matchData.map(_.group(0).trim -> 1)).reduceByKey(_ + _)https://stackoverflow.com/questions/50043890
复制相似问题