通过将日期与一系列日期 Scala Spark 进行比较来获取值



我只是新手

我有 3 个数据帧。bis只是通过使用synch_date添加适当的sale_price并将其与DEBUT和FIn进行比较的测试表。

这是我所做的,我只是 scala 的新手,在这里激发我所做的,是任何可以帮助 hpw 提出此加入请求的人,谢谢。

 val histocaisse = spark.read.option("header", true).csv("C:\Users\MHT\Desktop\histocaisse.csv")
    .withColumn("pos_id",'pos_id.cast(LongType))
    .withColumn("DEBUT",'DEBUT.cast(DateType))
    .withColumn("FIN",'FIN.cast(DateType))
    .withColumn("PRIXV",'PRIXV.cast(DoubleType))

  val test = spark.read.option("header", true).csv("C:\Users\MHT\Desktop\test.csv")
  test.show

  val bis = spark.read.option("header", true).csv("C:\Users\MHT\Desktop\bis.csv")
    .select("pos_id","synch_date","sale_price")

 +------+----------+----------+----------+
|pos_id|start_date|  end_date|sale_price|
+------+----------+----------+----------+
|     1|2000-01-02|2000-01-07|       2.5|
|     2|2000-02-18|2000-02-25|       2.3|
|     3|2000-03-02|2000-03-25|      14.0|
+------+----------+----------+----------+
+------+----------+
|pos_id|synch_date|
+------+----------+
|     1|2000-01-03|
|     2|2000-02-19|
|     3|2000-03-20|
+------+----------+
+------+----------+----------+
|pos_id|synch_date|sale_price|
+------+----------+----------+
|     1|2000-01-03|       2.5|
|     2|2000-02-19|       2.3|
|     3|2000-03-20|        14|
+------+----------+----------+

这个想法是基于pos_id连接第一个和第二个,我们将测试synch_date日期的范围,以便将sale_price与start_date和end_date之间的适当间隔相匹配。例如,对于日期 2000-01-03,我们看到它在哪个范围内,然后我们从第一个数据帧中获取适当的sale_price提前感谢您的帮助

给定dataframes

df1
+------+----------+----------+----------+
|pos_id|start_date|  end_date|sale_price|
+------+----------+----------+----------+
|     1|2000-01-02|2000-01-07|       2.5|
|     2|2000-02-18|2000-02-25|       2.3|
|     3|2000-03-02|2000-03-25|      14.0|
+------+----------+----------+----------+
df2
+------+----------+
|pos_id|synch_date|
+------+----------+
|     1|2000-01-03|
|     2|2000-02-19|
|     3|2000-03-20|
+------+----------+

我建议您不要join pos_id而是建议您使用条件匹配join,如下所示

df2.join(df1, (df2("synch_date") >= df1("start_date") && (df2("synch_date") <= df1("end_date"))), "left")
        .select(df2("pos_id"), $"synch_date", $"sale_price")

您应该有最终dataframe

+------+----------+----------+
|pos_id|synch_date|sale_price|
+------+----------+----------+
|1     |2000-01-03|2.5       |
|2     |2000-02-19|2.3       |
|3     |2000-03-20|14.0      |
+------+----------+----------+

left-joininner-joinouter-join之间进行选择是您想要的dataframe。您也可以在join过程中包括pos_id

如果您想在join中添加pos_id,那么您可以像下面这样

df2.join(df1, (df1("pos_id") === df2("pos_id")) && (df2("synch_date") >= df1("start_date")) && (df2("synch_date") <= df1("end_date")), "left")
    .select(df2("pos_id"), $"synch_date", $"sale_price")

我希望答案对您有所帮助

最新更新