2017-01-17 6 views
1

をチェック日付に基づいて新しい列を作成します。私はScalaでは2つのデータフレーム持っ

df1 = 

ID Field1 
1 AAA 
2 BBB 
4 CCC 

df2 = 

PK start_date_time 
1 2016-10-11 11:55:23 
2 2016-10-12 12:25:00 
3 2016-10-12 16:20:00 

を私はまた、フォーマット2016-10-11に等しいyyyy-MM-ddで変数start_dateを持っています。

df1に新しい列checkを作成する必要があります。If PK is equal to ID AND the year, month and day of start_date_time are equal to start_date, then check is equal to 1, otherwise 0です。

結果はこのようになります。

my previous question
df1 = 

ID Field1 check 
1 AAA  1 
2 BBB  0 
4 CCC  0 

私は2つのデータフレームを持っていたし、それが参加し、フィルタリングを使用することが示唆されました。ただし、この場合は動作しません。私の最初のアイデアはudfですが、このケースではどのように動作させるかはわかりません。

+0

sparkを使用していることを指定します。私が知っているScalaには、デフォルトのデータフレームはありません。 – Chobeat

答えて

1

この場合、joinwithColumnを組み合わせることができます。すなわち、まず、ID列にdf2に参加して、チェック欄変更するwhen.otherwiseの構文を使用します。

import org.apache.spark.sql.functions.lit 

val df2_date = df2.withColumn("date", to_date(df2("start_date_time"))).withColumn("check", lit(1)).select($"PK".as("ID"), $"date", $"check") 

df1.join(df2_date, Seq("ID"), "left").withColumn("check", when($"date" === "2016-10-11", $"check").otherwise(0)).drop("date").show 

+---+------+-----+ 
| ID|Field1|check| 
+---+------+-----+ 
| 1| AAA| 1| 
| 2| BBB| 0| 
| 4| CCC| 0| 
+---+------+-----+ 

それとも別のオプションを、まずdf2でフィルタした後、ID列にdf1とそれをバックに参加:

あなたは 2016-OCT-11のような日付を持っている場合は
val df2_date = (df2.withColumn("date", to_date(df2("start_date_time"))). 
        filter($"date" === "2016-10-11"). 
        withColumn("check", lit(1)). 
        select($"PK".as("ID"), $"date", $"check")) 

df1.join(df2_date, Seq("ID"), "left").drop("date").na.fill(0).show 

+---+------+-----+ 
| ID|Field1|check| 
+---+------+-----+ 
| 1| AAA| 1| 
| 2| BBB| 0| 
| 4| CCC| 0| 
+---+------+-----+ 

、あなたはそれをSQL日付を変換することができます比較のため次のようになります。

val format = new java.text.SimpleDateFormat("yyyy-MMM-dd") 
val parsed = format.parse("2016-OCT-11") 
val date = new java.sql.Date(parsed.getTime()) 
// date: java.sql.Date = 2016-10-11 
+0

'to_date'は' start_date_time'の値を 'yyyy-MM-dd'に自動的に変換しますか? 'start_date'に' yyyy-MMM-dd'があるとどうなりますか?それから 'start_date_time'は' start_date'とどのように比較されますか? – user7379562

+0

その場合、 'to_date'を使って直接変換することなく' start_date_time'を直接使うことができます。 – Psidom

+0

私は、 'start_date_time'が' 2016-10-11 11:55:23 'に等しく、 '2016-OCT-11'(' yyyy-MMM-dd')に等しい 'start_date' )。では、 'start_date_time'の書式をどこで定義しますか? – user7379562

関連する問題