如何在Apache Spark中将一列与同一数据框中的列进行比较

时间:2019-02-15 13:32:20

标签: scala apache-spark dataframe

我有一个日期列“ 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"
}

2 个答案:

答案 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|
+----------+----------+----------+-------+