我第一次在这里问一个问题,就像我这样的新手没有足够的Scala信息。
基本上我所拥有的是一个文件,其中包含数十万个这样格式化的列表:
(type, date, count, object)
行看起来像这样:
(food, 30052014, 400, banana)
(food, 30052014, 2, pizza)
我需要的只是找到计数最多的一行。
我知道我几个月前就这样做了,但现在似乎无法绕过它。我确信我也可以在没有功能的情况下做到这一点。我想要做的就是设置一个值并将该行放入其中但我无法理解它。
我认为基本上我想做的是列表中第3个元素的Math.max,但我无法得到它。
任何帮助将不胜感激。对不起,如果我的问题的措辞或格式不是最好的。
编辑:我遗漏了一些我应该补充的额外信息:
所有记录都存储在tsv文件中。我这样做是为了分裂它们:
val split_food = food.map(_.split("/t"))
基本上我认为我需要使用split_food ......某种程度上
答案 0 :(得分:3)
@Szymon的修改版本回答了您的编辑地址:
val split_food = food.map(_.split("/t"))
val max_food = split_food.maxBy(tokens => tokens(2).toInt)
或类似地:
val max_food = split_food.maxBy { case Array(_, _, count, _) => count.toInt }
如果你正在使用apache spark的RDD,它通常的scala集合方法数量有限,你必须使用reduce
val max_food = split_food.reduce { (max: Array[String], current: Array[String]) =>
val curCount = current(2).toInt
val maxCount = max(2).toInt // you probably would want to preprocess all items,
// so .toInt will not be called again and again
if (curCount > maxCount) current else max
}
答案 1 :(得分:2)
您应该使用maxBy
功能:
case class Purchase(category: String, date: Long, count: Int, name: String)
object Purchase {
def apply(s: String) = s.split("\t") match {
case Seq(cat, date, count, name) => Purchase(cat, date.toLong, count.toInt, name)
}
}
foodRows.map(row => Purchase(row)).maxBy(_.count)
答案 2 :(得分:0)
简单地:
case class Record(food:String, date:String, count:Int)
val l = List(Record("ciccio", "x", 1), Record("buffo", "y", 4), Record("banana", "z", 3))
l.maxBy(_.count)
>>> res8: Record = Record(buffo,y,4)
答案 3 :(得分:0)
不确定你是否得到了答案,但我遇到了与maxBy相同的问题。我发现一旦我运行了包... import scala.io.Source
我能够使用maxBy并且它有效。