通过将日期与日期范围scala spark进行比较来确定值

时间:2017-10-16 09:52:09

标签: scala apache-spark dataframe

我是新手

我有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加入第一个和第二个,我们将测试sync_date的日期范围,以便将sale_price与start_date和end_date之间的适当间隔进行匹配。 例如,对于2000-01-03的日期,我们看到它在哪个范围内,然后我们从第一个数据帧中获取适当的sale_price 感谢您的帮助

1 个答案:

答案 0 :(得分:0)

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。您也可以在pos_id流程中加入join

如果您想在pos_id中添加join,那么您可以使用以下内容

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")

我希望答案很有帮助