比较列表中包含n个值的两列,并将数据保存为scala中的列表

时间:2018-05-24 12:21:59

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

我需要在两列上执行比较操作(例如大于或小于),列中包含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"]

1 个答案:

答案 0 :(得分:0)

  

我需要执行比较操作

您似乎正在寻找.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""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)