2016-11-21 55 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]失敗: ``工會 '' 預期但`(」發現

SELECT SUM(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:上面的方法你已經使用了,這個查詢怎麼樣..'選擇總和(reccount)從erv小時<= 4' –

+1

@RamPrasadG:謝謝,這個工作.. – Shankar

回答

0

不知道爲什麼你想使用窗口功能,如果你可以簡單地filter得到正確的時間和agg

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類型 –

相關問題