2017-10-16 51 views
-1

我剛剛爲此創建了新的通過將日期與日期範圍scala進行比較來創建值火花

我有3個數據框。這只是只是測試表,通過使用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,爲了配合start_date和end_date之間適當的間隔的SALE_PRICE。 例如,對於我們看到的日期2000-01-03在範圍,然後我們採取適當的SALE_PRICE從第一數據幀 感謝您的幫助提前

+0

請澄清你的問題有點多。你想加入第一個和第二個數據框來獲得第三個數據框嗎?如果是的話,邏輯是什麼?如果沒有,你想要的是什麼?您的sale_price與PRIXV匹配。這是巧合還是事實?那pos_id呢? .....還有更多 –

+0

@RameshMaharjan你好,謝謝你總是救我,我編輯的問題是更好? –

+0

如果synch_date不在start_date和end_date的範圍內,你會怎麼做?以及如果有多個與synch_date匹配的日期範圍呢? –

回答

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

我建議你joinpos_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") 

你應該有left-joininner-joinouter-join之間最終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  | 
+------+----------+----------+ 

選擇你希望你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") 

我希望答案是有幫助的

+0

怎麼能包括pos_id,因爲它就像一個關鍵,加入。我可以如何整合它,謝謝很多:) –

+0

我有更新我的答案:)請檢查 –

+0

我可以做與其他列相同的東西如果我想要 ? –