2016-11-21 6 views
-1

ルックアップテーブルデータを持つDataFrameがあります。毎時ごとにこのテーブルにエントリがあります。現在の時間までのレコードの総数はどのように計算されますか?例えばルックアップテーブルから現在の時間までのレコードの総数を取得する方法

私のDFデータ

+----+-----+ 
|hour|count| 
+----+-----+ 
|0.00| 10| 
|1.00| 5| 
|2.00| 10| 
|3.00| 15| 
|4.00| 10| 
|5.00| 10| 
+----+-----+ 

私は、入力として "4.00" を渡すと、それは4時間までの合計数を返す必要がありますが。

予想される出力は次のようになります。

Total count 
50 

サンプルコードは、私が試した:

val df = Seq(("0.00", "10"), 
      ("1.00", "15")).toDF("hour", "reccount") 
     df.show 
     df.printSchema 

     df.registerTempTable("erv") 
     //sqlContext.sql("select hour,reccount from erv").show 
sqlContext.sql("select sum(reccount) over(partition by hour) as running_total from erv").show 

が、私は以下のエラーを取得しています。

スレッドの例外 "メイン" java.lang.RuntimeException:[1.26]失敗:)時間単位でパーティション(上 ``組合 '' 期待が、 `(」が見つかり

選択合計(RECCOUNT) ERV

からrunning_totalように私はまた、以下のようなウィンドウ機能を試してみましたが、私はそのはHiveContextを作成していないローカルHiveContextを作成しようとすると、その期待HiveContextは、作成する必要があります。

窓関数のコード:

val wSpec = Window.partitionBy("hour").orderBy("hour").rowsBetween(Long.MinValue, 0) 
df.withColumn("cumSum", sum(df("reccount")).over(wSpec)).show() 
+1

@TzachZoharを、見てください。 – Shankar

+1

@Shankar:あなたが使った上記のアプローチは何ですか?このクエリについては何でしょうか.. 'select sum(reccount)from erv where hour = 4' –

+1

@RamPrasadG:ありがとう、これは働いています.. – Shankar

答えて

0

ないあなたはあなたができる場合は、右時間とagg取得するには、単にfilterウィンドウ機能を使用したいと思います理由を確認してください。私は、コードを更新:

val upTo = 4.0 
val result = input.filter($"hour" <= upTo).agg(sum($"count") as "Total Count") 

result.show() 
// +-----------+ 
// |Total Count| 
// +-----------+ 
// |   50| 
// +-----------+ 
+0

優秀..なぜ私はこれのように考えていないのですか? – Shankar

+0

私は "4:00"の時にこのフォーマットが動作していない場合、それをintに変換する必要がありますか? – Shankar

+0

何とか解析してからintに変換する必要があります。 ':'で分割し、左側だけを取り出してint型にキャストします –

関連する問題