簡體   English   中英

如何在 spark scala 中投射時間戳以獲取小時 HH 格式

[英]how to cast timestamp to get hour HH format in spark scala

我有一個 csv 數據文件,其中包含一列時間格式為 HH:MM:SS 我試圖使用 spark-sql 查詢 csv 以獲得最繁忙和最不繁忙的入口/出口時間。 誰能幫我解決這個問題? 非常感激 !

這是我的 csv 文件示例:

emp_name,emp_badge,door_number,date_time,usage_type
Capucine Letellier,28161comp,5,22:36:27,ENTRANCE
Zoé Bonnin de la Lenoir,75976comp,5,01:08:49,ENTRANCE
Henri Potier,66586comp,4,03:13:16,ENTRANCE
Théodore Rodriguez,39004comp,3,20:55:11,ENTRANCE
Christine Bonneau de Rodrigues,23965comp,4,18:45:42,EXIT

如果您的 csv 包含

  1. 像 "HH:MM:ss" 這樣的字符串然后:

     val myCsv = spark.read.csv("path/to/csv") //this one splits you string by : and takes the first part of it val addHour = myCsv.withColumn("hour", split($"date_time", ":")(0))
  2. 時間戳格式然后:

     val myCsv = spark.read.csv("path/to/csv") // Cast it first to timestamp because csv doesn't keep column format, after that format it to HH val addHour = myCsv.withColumn("hour", date_format($"date_time".cast("timestamp"), "HH"))

我希望這對你有幫助。

稍后編輯:要對列使用 $ 運算符,您需要導入 spark 隱式:

import spark.implicits._

現在您可以使用 $ 代替 col("column_name") 函數。

您可以使用hour(string date)函數來返回時間戳的小時數。 示例: hour('2009-07-30 12:58:59') = 12 , hour('12:58:59') = 12

接下來,您可以像這樣計算繁忙時間和不太繁忙的時間:

import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions._

val rawData = spark.read.csv("data.csv")

// Busy Hours calculation
val windowSpecBusyHours = Window.partitionBy("_c4").orderBy(col("transactions").desc)
val busyHours = rawData
  .withColumn("hours", hour(col("_c3")))
  .groupBy("_c4", "hours").agg(count("*").alias("transactions"))
  .withColumn("dense_rank", dense_rank().over(windowSpecBusyHours))
  .select("_c4", "hours", "transactions").where(col("dense_rank") === 1)
busyHours.show(false)

// Less Busy Hours calculation
val windowSpecLessBusyHours = Window.partitionBy("_c4").orderBy(col("transactions").asc)
val lessBusyHours = rawData
  .withColumn("hours", hour(col("_c3")))
  .groupBy("_c4", "hours").agg(count("*").alias("transactions"))
  .withColumn("dense_rank", dense_rank().over(windowSpecLessBusyHours))
  .select("_c4", "hours", "transactions").where(col("dense_rank") === 1)
lessBusyHours.show(false)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM