我有一个日期列“ a”,需要将其与日期类型的另外两个列“ b”和“ c”进行比较。所有这些列都属于同一数据框。
示例数据如下
{
"a": "10 - 12 - 2019",
"somecol": {
"startdate": "10 - 06 - 2019",
"enddate": "10 - 12 - 2020"
}
}
如果col(“ a”)在“开始日期”和“结束日期”之间,则对我来说是有效记录。我如何才能做到这一点。一件事是我可以爆炸“ somecol”,然后进行联接并与条件进行比较。但是,我想知道是否还有其他方法。
预期输出:
由于列“ a”的值介于“开始日期”和“结束日期”之间,因此最终输出为
{
"a": "10 - 12 - 2019",
"somecol": {
"startdate": "10 - 06 - 2019",
"enddate": "10 - 12 - 2020"
},
"status": "valid"
}
答案 0 :(得分:1)
val inputDF = spark.sparkContext.parallelize(List(
("2018-12-12", "2018-12-01", "2018-12-31"),
("2019-02-12", "2018-12-11", "2018-12-12")
)).toDF("ds", "start", "end")
.select(col("ds").cast("date"), col("start").cast("date"), col("end").cast("date"))
val outputDF = inputDF.withColumn("status", col("ds") >= col("start") && col("ds") <= col("end"))
outputDF.show()
+----------+----------+----------+-------+
| ds| start| end| status|
+----------+----------+----------+-------+
|2018-12-12|2018-12-01|2018-12-31| true|
|2019-02-12|2018-12-11|2018-12-12| false|
+----------+----------+----------+-------+
答案 1 :(得分:1)
这是我的解决方法。
val data = Seq(("10-12-2019", "10-06-2019", "10-12-2020"),
("11-12-2020", "10-06-2019", "10-12-2020"))
val spark = getSession()
import spark.implicits._
val df = spark.sparkContext.parallelize(data).toDF("a", "startdate", "enddate")
import org.apache.spark.sql.functions.to_date
val modifiedDF = df.withColumn("a", to_date($"a", "dd-MM-yyyy"))
.withColumn("startdate", to_date($"startdate", "dd-MM-yyyy"))
.withColumn("enddate", to_date($"enddate", "dd-MM-yyyy"))
modifiedDF.withColumn("isValid", !$"a".gt($"enddate").and(!$"a".lt($"enddate"))).show()
结果
+----------+----------+----------+-------+
| a| startdate| enddate|isValid|
+----------+----------+----------+-------+
|2019-12-10|2019-06-10|2020-12-10| true|
|2020-12-11|2019-06-10|2020-12-10| false|
+----------+----------+----------+-------+