Как сгруппировать значения DataFrame по часам? - PullRequest
0 голосов
/ 28 августа 2018

У моего исходного 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

Я бы хотел сгруппировать по дд / мм / гггг ЧЧ24. В SQL мы можем использовать to_date('Time','dd/mm/yyyy hh24'), но в 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")

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

Функция "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                        |
+-------------------------------------------+
0 голосов
/ 28 августа 2018

Вы получаете ошибки, потому что ваша версия Spark ниже 2.2.0

Spark 2.2.0 представляет def to_date(e: Column, fmt: String). Проверьте 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|
+-------------------+----------+
0 голосов
/ 28 августа 2018
df.withColumn(“hour”,split(col(“Time”),” “) (1).substr(0,2))
  .groupBy(“Time”,”hour”)
  .sum(“Attempt”)
  .drop(“hour”)
  .withColumn(“Time”,split(col(“Time”),”:”)(0))
  .show
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...