在Scala中过滤

时间:2017-03-30 22:20:24

标签: scala datetime apache-spark

假设我有以下数据(仅前几行,此数据涵盖整整一年) -

(2014-08-31T00:05:00.000+01:00, John)
(2014-08-31T00:11:00.000+01:00, Sarah)
(2014-08-31T00:12:00.000+01:00, George)
(2014-08-31T00:05:00.000+01:00, John)
(2014-09-01T00:05:00.000+01:00, Sarah)
(2014-09-01T00:05:00.000+01:00, George)
(2014-09-01T00:05:00.000+01:00, Jason)

我想过滤数据,以便只查看特定日期的名称(例如,2014-09-05)。我已尝试使用Scala中的过滤器功能执行此操作,但我一直收到以下错误 -

error: value xxxx is not a member of (org.joda.time.DateTime, String)

还有另一种方法吗?

4 个答案:

答案 0 :(得分:2)

filter方法接受一个称为谓词的函数,该函数将(我假设的)RDD的元素作为参数,并返回Boolean

返回的RDD将仅保留谓词评估为true的行。

在你的情况下,你想要的似乎是

rdd.filter{
  case (date, _) => date.withTimeAtStartOfDay() == new DateTime("2017-03-31")
}

答案 1 :(得分:1)

这是一个函数,它接受日期,日期时间名称对的列表,并返回日期的名称列表:

def getNames(d: String, l: List[(String, String)]): List[String] = {
  val date = """^([^T]*).*""".r

  val dateMap = list.map {
    case (x, y) => ( x match { case date(z) => z }, y )
  }.
  groupBy(_._1) mapValues( _.map(_._2) )

  dateMap.getOrElse(d, List[String]())
}

val list = List(
  ("2014-08-31T00:05:00.000+01:00", "John"),
  ("2014-08-31T00:11:00.000+01:00", "Sarah"),
  ("2014-08-31T00:12:00.000+01:00", "George"),
  ("2014-08-31T00:05:00.000+01:00", "John"),
  ("2014-09-01T00:05:00.000+01:00", "Sarah"),
  ("2014-09-01T00:05:00.000+01:00", "George"),
  ("2014-09-01T00:05:00.000+01:00", "Jason")
)

getNames("2014-09-01", list)
res1: List[String] = List(Sarah, George, Jason)

答案 2 :(得分:1)

我从标签中假设你的问题是在Spark的背景下,而不是纯粹的Scala。鉴于此,您可以过滤日期中的数据框并获取相关的名称,如下所示:

import org.apache.spark.sql.functions._
import sparkSession.implicits._

Seq(
  ("2014-08-31T00:05:00.000+01:00", "John"),
  ("2014-08-31T00:11:00.000+01:00", "Sarah")
...
)
.toDF("date", "name")
.filter(to_date('date).equalTo(Date.valueOf("2014-09-05")))
.select("name")

请注意,上面的Datejava.sql.Date

答案 3 :(得分:-1)

val dateTimeStringZero = "2014-08-12T00:05:00.000+01:00"
val dateTimeOne:DateTime = org.joda.time.format.ISODateTimeFormat.dateTime.withZoneUTC.parseDateTime(dateTimeStringZero)

import java.text.SimpleDateFormat
val df = new DateTime(new SimpleDateFormat("yyyy-MM-dd").parse("2014-08-12"))

println(dateTimeOne.getYear==df.getYear)
println(dateTimeOne.getMonthOfYear==df.getYear)

...