【问题标题】:Looping with RDDs in Spark with Scala使用 Scala 在 Spark 中使用 RDD 循环
【发布时间】:2018-09-29 22:47:07
【问题描述】:

所以我在 Spark Shell 中使用 Scala 完成了这个任务,我们得到了一个大约 300 万条推文的 tsv 文件,我们应该估计下一条推文的位置(这是我们编写的文本文件的输入)关于朴素贝叶斯估计。这样,如果我写“请帮我解决 stackoverflow”,它将输出最有可能在该位置发布推文的获胜者,例如:“伯明翰,0.2”

首先我从 tsv 文件中获取数据并进行一些 rdd 转换:

val t = sc.textFile("PATH-TO-DATASET")
val s = t.map(_.split('\t')) //
val location = s.map(x => x(4))
val locAndTweetText = s.map(x => (x(4),x(10)))
val distinctLoc = location.distinct()

现在我想做但不知道的是:如何遍历每个位置并输出该位置相对于整个数据集的比例?

我尝试过以下变体:

for (e <- distinctLoc) {
  val a = location.filter(x => x == e).count()
  val b = a / t.count()
  println(b)
}

但我总是遇到错误。在此之后,我需要为每个位置的文件的输入词再次执行相同的操作,但是当我什至没有一个工作循环时,我无法执行嵌套的 for 循环。有人知道吗?

【问题讨论】:

  • 错误是什么?
  • “我不断收到错误”并不是我们为您提供帮助的足够精确的错误描述。 什么不起作用? 如何不起作用?你的代码有什么问题?您收到错误消息吗?错误信息是什么?你得到的结果不是你期望的结果吗?你期望什么结果,为什么,你得到的结果是什么,两者有什么不同?您正在观察的行为不是期望的行为吗?期望的行为是什么,为什么,观察到的行为是什么,它们有何不同?

标签: scala loops bigdata rdd


【解决方案1】:

您使用的是 RDD,而不是数组。你必须以不同的方式对待他们。具体来说,您不能像在此处那样将另一个 rdd 操作嵌套到彼此中。

看起来您正在尝试计算每个位置的数量。这是使用groupBy 完成的,使用元素本身作为键,然后计算每个键有多少元素。

val locationCounts = location.groupBy(identity).mapValues(iter => iter.length())

然后您尝试计算这些计数与总记录计数的比率。您可以在任何循环或其他 rdd 操作之外获得 t 的计数。

val totalCount = t.count()

最后,迭代locationCounts RDD 并打印值。

for((location, count) <- locationCounts){
  val ratio = count / totalCount.toDouble
  println(location + ": " + ratio)
}

如果您想在新的 RDD 中获取结果而不是打印出来,只需使用 map 而不是 foreach。

val locationRatios = locationCounts.map{
  case (location, count) => location -> (count / totalCount.toDouble)
}

或使用for版本

val locationRatios = for((location, count) <- locationCounts) 
   yield location -> (count / totalCount.toDouble)

现在locationRatios 是一个RDD[(String, Double)],包含每个位置的记录总数的比率。

【讨论】:

  • 效果很好,谢谢!但是,我不想打印它,而是想将它存储在函数外部的新 RDD 或数组中,但操作结束后 RDD 或列表不会更新。有什么想法可以解决吗?非常感谢您的帮助:)
  • @OneQuestionAwayFromNirvana 我已更新我的答案以包含该案例
  • 谢谢一百万!
猜你喜欢
  • 1970-01-01
  • 2016-12-16
  • 2015-07-05
  • 1970-01-01
  • 2017-06-27
  • 2017-10-18
  • 1970-01-01
  • 2020-09-06
  • 1970-01-01
相关资源
最近更新 更多