【问题标题】:Scala how to find the max of Intgers in a List[Row]Scala如何在列表中找到最大整数[行]
【发布时间】:2018-11-27 03:44:46
【问题描述】:

让列表为

val list = List([80], [79], [92])

如何在 scala 中获取最大值。该列表是 List[Row] 而不是 List[Int]

【问题讨论】:

  • 您应该添加 spark 标签并提及您正在谈论org.apache.spark.sql.Row
  • 添加了@PaulGeorgPodlech

标签: scala apache-spark apache-spark-sql bigdata


【解决方案1】:

假设您的Row 将只包含Ints,您可以将其转换为Seq,然后应用max

list.flatMap(_.toSeq.asInstanceOf[Seq[Int]]).max

快速示例:

import org.apache.spark.sql.Row
val list: List[Row] = List(Row(1), Row(2))
List[org.apache.spark.sql.Row] = List([1], [2])


scala> list.flatMap(_.toSeq.asInstanceOf[Seq[Int]]).max
Int = 2

编辑

编辑以匹配 OP 提供的输入

import scala.util.parsing.json.JSON



 val list = List(Row("""{"name":"abc","salary":"2000","id":"1","timeStamp" : "1528725600000"}"""))



list.map(r => JSON.parseFull(r.getString(0)))
.map(x => x.flatMap[Any]({
              case x: Map[String, _] => x.get("timeStamp")
              case _ => None
          }))
.map(x => x match {
          case Some(i: String) => i 
          case _ => "" })
.max
  • 第一个 map 会将行内的 json 解析为 Map
  • 第二个将仅从该地图获取时间戳
  • 第三张地图将处理作为 Option[Any] 的时间戳并将其转换为字符串
  • 最后max会得到所有接收到的时间戳的最大值

【讨论】:

  • 但是如果有一个 foreach 我必须迭代 List[Row] 对象来找到最大值
  • 我不明白。 flatMap 将遍历所有元素
  • 嗯,有一个预定义的结构。有一个 foreach 循环。因为数据是这样的 val list = List(Row("""{"name":"abc","salary":"2000","id":"1","timeStamp" : "1528725600000"} """)) 。有几个这样的行。让我们假设我们正在获取键和值。由于各种原因,我必须遍历循环。在迭代循环时,我可以找到关键时间戳的最大值吗?
  • 哇,这应该是问题所在。重要的是要知道 Row 内会有一个 json 以便回答它。您需要解析 json 并检索所需的密钥。然后你可以得到最大值。我会更新我的答案
  • 是的。谢谢@Scouto
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-31
  • 2021-10-26
  • 1970-01-01
  • 2021-05-06
  • 1970-01-01
  • 2017-01-10
  • 2017-02-28
相关资源
最近更新 更多