2016-11-21 44 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类型 –

相关问题