假设我有以下数据(仅前几行,此数据涵盖整整一年) -
(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)
还有另一种方法吗?
答案 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")
请注意,上面的Date
为java.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)
...