首页 > 解决方案 > 比较具有 n 个值的列表的两列,并将数据保存为 scala 中的列表

问题描述

我需要对具有 n 个值的列表(值只是时间戳)的两列执行比较操作(如大于或小于),并且我的结果也应该在列表中。

我该怎么做这个操作?

输入:

Date1                                         Date2
["2016-11-24 12:06:47"]                       ["2017-10-04 03:30:23"]
["null"]                                      []
["2017-01-25 10:07:25","2018-01-25 10:07:25"] ["2017-09-15 03:30:16","2017-09-15 03:30:16"]

输出应该是:

Result
["Less"]
["Not Okay"]
["Less","Great"]

标签: scalaapache-sparkapache-spark-sql

解决方案


我需要进行比较操作

看来您正在寻找.compareTo运营商:

scala> "a".compareTo("b")
res: Int = -1

scala> "a".compareTo("a")
res: Int = 0

scala> "b".compareTo("a")
res: Int = 1

使用提到的第一个示例:

val date1 = "2016-11-24 12:06:47"
val date2 = "2017-10-04 03:30:23"

scala> date1.compareTo(date2)
res: Int = -1

如果我们暂时忽略这种"Not Okay"情况,我们可以使用如下函数实现"Less"or"Great"情况:

def compareLexicographically(s1: String, s2: String): String = s1.compareTo(s2) match {
  case -1 => "Less"
  case _  => "Great"
}

查看您的示例,我假设行是字符串列表的元组:

val rows: List[(List[String], List[String])] = 
List((
  List("2016-11-24 12:06:47"),
  List("2017-10-04 03:30:23")
),
(
  List("2017-01-25 10:07:25", "2018-01-25 10:07:25"),
  List("2017-09-15 03:30:16", "2017-09-15 03:30:16")
))

我会首先zip从列中获取元素List[(String, String)]

rows.flatMap(r => r._1.zip(r._2))

然后很map简单compareLexicographically

scala> rows.flatMap(r => r._1.zip(r._2)).map((compareLexicographically _).tupled)
res: List[String] = List(Less, Great, Great)

推荐阅读