Sql 如何按小时对数据帧值进行分组?

Sql 如何按小时对数据帧值进行分组?,sql,scala,apache-spark,Sql,Scala,Apache Spark,我的源CSV有时间列,例如 Time Attempt 12.07.2018 00:00:00 50 12.07.2018 00:15:00 60 ... 13.07.2018 00:00:00 100 13.07.2018 00:15:00 30 我想按dd/mm/yyyy HH24分组。在SQL中,我们可以使用来确定日期('Time','dd/mm/yyyyyyyh24'),但在Spark中,我已经尝试过了,但下面显示了错误。 请告知。多谢各位 val dfAgg = df.

我的源CSV有时间列,例如

Time Attempt
12.07.2018 00:00:00  50
12.07.2018 00:15:00  60
...
13.07.2018 00:00:00  100
13.07.2018 00:15:00  30
我想按dd/mm/yyyy HH24分组。在SQL中,我们可以使用
来确定日期('Time','dd/mm/yyyyyyyh24')
,但在Spark中,我已经尝试过了,但下面显示了错误。 请告知。多谢各位

    val dfAgg = df.select(
unix_timestamp($"time", "yyyy/MM/dd HH:mm:ss").cast(TimestampType).as("timestamp")
,unix_timestamp($"time", "yyyy/MM/dd HH").cast(TimestampType).as("time2")
,to_date($"time","HH").as("time3")
,to_date($"time","yyyy/MM/dd").as("time4")
)
<console>:94: error: too many arguments for method to_date: (e: org.apache.spark.sql.Column)org.apache.spark.sql.Column
   ,to_date($"time","HH").as("time3")
           ^
<console>:95: error: too many arguments for method to_date: (e: org.apache.spark.sql.Column)org.apache.spark.sql.Column
   ,to_date($"time","yyyy/MM/dd").as("time4")
val-dfAgg=df.select(
unix_时间戳($“time”,“yyyy/MM/dd HH:MM:ss”).cast(TimestampType).as(“时间戳”)
,unix_timestamp($“time”,“yyyy/MM/dd HH”).cast(TimestampType).as(“time2”)
,截至日期($“时间”,“HH”)。作为(“时间3”)
,截止日期($“时间”,“yyyy/MM/dd”)。作为(“时间4”)
)
:94:错误:截止日期的方法的参数太多:(e:org.apache.spark.sql.Column)org.apache.spark.sql.Column
,截至日期($“时间”,“HH”)。作为(“时间3”)
^
:95:错误:截止日期的方法的参数太多:(e:org.apache.spark.sql.Column)org.apache.spark.sql.Column
,截止日期($“时间”,“yyyy/MM/dd”)。作为(“时间4”)
函数“to_timestamp”可用于将字符串转换为时间戳:

  val data = List(
  ("12.07.2018 00:00:00", 50),
  ("12.07.2018 00:15:00", 60),
  ("13.07.2018 00:00:00", 100),
  ("13.07.2018 00:15:00", 30))

val df = data.toDF("time", "value").select(
  to_timestamp($"time", "dd.MM.yyyy HH:mm:ss")
)
df.printSchema()
df.show(false)
输出:

root
 |-- to_timestamp(`time`, 'dd.MM.yyyy HH:mm:ss'): timestamp (nullable = true)

+-------------------------------------------+
|to_timestamp(`time`, 'dd.MM.yyyy HH:mm:ss')|
+-------------------------------------------+
|2018-07-12 00:00:00                        |
|2018-07-12 00:15:00                        |
|2018-07-13 00:00:00                        |
|2018-07-13 00:15:00                        |
+-------------------------------------------+

由于Spark版本低于2.2.0,因此出现错误

Spark 2.2.0将
def引入到\u日期(e:列,fmt:字符串)
。检查API

您可以使用
to_timestamp()
函数创建小时窗口:

  val df = data.toDF("time", "value")
    .select('time, 'value, to_timestamp('time, "dd.MM.yyyy HH") as "hour_window")
    .groupBy('hour_window).sum("value").show
返回:

+-------------------+----------+
|        hour_window|sum(value)|
+-------------------+----------+
|2018-07-13 00:00:00|       130|
|2018-07-12 00:00:00|       110|
+-------------------+----------+

我猜这是标题的一个输入错误,它可以按小时分组,但在节目中我们有完整的时间戳和小时。能给我们一个时间戳吗?
+-------------------+----------+
|        hour_window|sum(value)|
+-------------------+----------+
|2018-07-13 00:00:00|       130|
|2018-07-12 00:00:00|       110|
+-------------------+----------+