我只是新手
我有 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-join
或inner-join
或outer-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")
我希望答案对您有所帮助