2017-05-22 7 views
0

私が注文テーブルを持って、私は以下のような日常のための累積量を合計することができますスパークで空の日付を記入するには?

date amount 

2017/5/1 1000 

2017/5/5 2000 

をしかし、私は取得したい:

date amount 

2017/5/1 1000 

2017/5/2 1000 

2017/5/3 1000 

2017/5/4 1000 

2017/5/5 2000 

2017年5月2日の間には順序がありません2017-05-04ですので、金額は1000のままです。これを行うにはどうすればよいですか?

+0

入力データセットは?注文がなかった日に欠落した行を生成しますか? –

答えて

3

以下のスニペットが機能するはずです。ここでは、基本的に開始日と終了日の間のすべての日付をリストする別のデータフレームとデータセットの間で左結合を実行します。

import org.apache.spark.sql.expressions.Window 

val df1 = Seq(("2017/5/1", 1000), ("2017/5/5", 1000)).toDF("day","value") 

val df2 = Seq("2017/5/1","2017/5/2","2017/5/3","2017/5/4","2017/5/5").toDF("date") 

val result = df2 
     .join(df1, df1("day") === df2("date"), "left_outer") 
     .withColumn("value", when($"value".isNull,0).otherwise($"value")) 
     .select("date","value") 
     .withColumn("value", sum($"value").over(Window.orderBy($"date"))) 

result.show() 
{"level": "WARN ", "timestamp": "2017-05-22 05:01:28,693", "classname": "org.apache.spark.sql.execution.WindowExec", "body": "No Partition Defined for Window operation! Moving all data to a single partition, this can cause serious performance degradation."} 
+--------+-----+ 
| date|value| 
+--------+-----+ 
|2017/5/1| 1000| 
|2017/5/2| 1000| 
|2017/5/3| 1000| 
|2017/5/4| 1000| 
|2017/5/5| 2000| 
+--------+-----+ 
+0

ありがとう、私はあなたのポイントを得る!左の結合は問題を解決するでしょう –

+0

@leiyuこれがあなたの問題を解決すれば答えを受け入れることができますか? –

関連する問題