Linux 如何在Spark中编写一个独立的应用程序,在一个包含提取推文的文本文件中找到20条最常提及的内容

Linux 如何在Spark中编写一个独立的应用程序,在一个包含提取推文的文本文件中找到20条最常提及的内容,linux,scala,apache-spark,Linux,Scala,Apache Spark,我正在spark中创建一个独立的应用程序,我需要在其中读取一个充满tweets的文本文件。每次提及都以符号“@”开头。我们的目标是浏览这个文件,找到最多20次提及。标点符号应该从所有提到的内容中删除,如果tweet多次提到同一个内容,则只应计算一次。在一条推文中可以有多个独特的提及。文件中有许多tweet 我是scala和apache spark的新手。我正在考虑使用filter函数并将结果放在一个列表中。然后将列表转换为项目唯一的集合。但是语法、正则表达式和读取文件是我面临的一个问题 def

我正在spark中创建一个独立的应用程序,我需要在其中读取一个充满tweets的文本文件。每次提及都以符号“@”开头。我们的目标是浏览这个文件,找到最多20次提及。标点符号应该从所有提到的内容中删除,如果tweet多次提到同一个内容,则只应计算一次。在一条推文中可以有多个独特的提及。文件中有许多tweet

我是scala和apache spark的新手。我正在考虑使用filter函数并将结果放在一个列表中。然后将列表转换为项目唯一的集合。但是语法、正则表达式和读取文件是我面临的一个问题

def main(参数:数组[字符串]){ val locationTweetFile=args(0) val spark=SparkSession.builder.appName(“这有关系吗?”).getOrCreate() tweet文件很大,下面的命令安全吗

val tweetsFile = spark.read.textFile(locationTweetFile).cache()
val mentionsExp = """([@])+""".r

}
如果推特上说 “嘿@Honda,我是@customer我爱@Honda。我是最喜欢的@customer。” 那么输出应该是这样的((本田,1),(客户,1))

因为有多条推文,另一条推文可以说, “@HoNdA我是同一个@cuSTomER@STACKEXCHANGE。” 那么最终的输出将是 ((本田,2),(客户,2),(stackexchange,1))

让我们一步一步走

1)
appName(“这有关系吗?”)
在您的情况下并不重要

2)
spark.read.textFile(文件名)
是安全的,因为它的惰性,文件不会加载到内存中

现在,关于实施:

Spark是关于数据转换的,因此您需要考虑如何将原始推文转换为每条推文中唯一提及的列表。接下来,您将提及列表转换为
Map[title,Int]
,其中
Int
是RDD中提及的总数

转换通常通过
map(f:A=>B)
方法完成,其中
f
是将
A
值映射到
B
的函数

def tweetToMentions(tweet: String): Seq[String] =
  tweet.split(" ").collect {
    case s if s.startsWith("@") => s.replaceAll("[,.;!?]", "").toLowerCase
  }.distinct.Seq

val mentions = tweetToMentions("Hey @Honda, I am @customer I love @honda. I am favorite @CUSTOMER.")
// mentions: Seq("@honda", "@customer")
下一步是将此函数应用于RDD中的每个元素:

val mentions = tweetsFile.flatMap(tweetToMentions)
请注意,我们使用
flatMap
而不是
map
,因为
tweettoments
返回
Seq[String]
并且我们希望RDD只包含提及,
flatMap
将平坦结果

要计算RDD中每一项提及的发生率,我们需要应用一些魔法:

首先,我们将提到的内容映射到成对的
(提到,1)

提及.map(提及=>(提及,1))

然后我们使用
reduceByKey
,它将计算RDD中每个提及的次数。最后,我们根据提及的次数和检索结果对提及进行排序

val result = mentions
  .map(mention => (mention, 1))
  .reduceByKey((a, b) => a + b)
  .takeOrdered(20)(Ordering[Int].reverse.on(_.2))

您好!到目前为止您尝试了什么?您想知道
spark.read.textFile
是否安全,或者缓存一个大数据集是否安全?为什么要创建两次提及变量?distinct.Seq不是编译器所说的数组的一部分。而.flatMap(TweetToments)无法找到类型字符串的编码。