[英]Spark Scala - String to Timestamp
我正在對 Scala 中的一些溫度值進行平均,並試圖找到每小時最冷的溫度。 然后,無論哪個時期的溫度最低,並且整個數據集中出現的次數最多,我想那個時候 select。
我的代碼似乎正確地進行了我的計算和窗口化,我唯一的問題是需要能夠正確地 output 時間 window。 下面的代碼從我的輸入文件中提取各個列(月、日、年、時間都分解為各個列)並將它們連接到一個列中。
我的代碼
val data = osh.select(col("TemperatureF"), concat(format_string("%02d",col("Month")),lit("/"),format_string("%02d",col("Day")),lit("/"),col("Year"),lit(" "),col("TimeCST")).as("Date")).show()
來自上述代碼的示例輸入:
+------------+-------------------+
|TemperatureF| Date|
+------------+-------------------+
| 35.1|01/01/2000 12:53 AM|
| 35.1| 01/01/2000 1:53 AM|
| 35.1| 01/01/2000 2:53 AM|
| 34.0| 01/01/2000 3:53 AM|
| 32.0| 01/01/2000 4:53 AM|
| 30.9| 01/01/2000 5:53 AM|
| 28.0| 01/01/2000 6:53 AM|
+------------+-------------------+
處理此輸入時,我嘗試將其從字符串(因為它是連接的)轉換為以下形式的時間戳: MM/dd/yyyy hh:mm a
。 我的代碼目前似乎將我的時間戳轉換為 24 小時制。 從我所做的閱讀來看,使用hh
而不是HH
應該是指 12 小時的跨度,並且a
應該添加 AM/PM。 任何建議如何改變這個問題?
完整代碼:
val data = osh.select(col("TemperatureF"), concat(format_string("%02d",col("Month")),lit("/"),format_string("%02d",col("Day")),lit("/"),col("Year"),lit(" "),col("TimeCST")).as("Date")).show()
val ts = to_timestamp($"Date","MM/dd/yyyy hh:mm a")
val mydata=data.withColumn("ts",ts).show()
val groupByWindow = mydata.groupBy(window(col("ts"), "1 hour")).agg(avg("TemperatureF").as("avgTemp")).select("window.start", "window.end", "avgTemp").show()
val daily = groupByWindow.withColumn("_tmp",split($"start"," ")).select($"_tmp".getItem(0).as("Date"),$"_tmp".getItem(1).as("StartTime"),$"end",$"avgTemp").withColumn("_tmp2",split($"end"," ")).select($"Date",$"StartTime",$"_tmp2".getItem(1).as("EndTime"),$"avgTemp")
daily.createOrReplaceTempView("myview")
spark.sqlContext.sql("Select StartTime,EndTime,avg(avgTemp) avgTemp,count(*) Total from myview group by StartTime,EndTime order by avgTemp ASC, total DESC").show()
當前 Output:
+---------+--------+-------------------+-----+
|StartTime| EndTime| avgTemp|Total|
+---------+--------+-------------------+-----+
| 10:00:00|11:00:00|-16.314026481823376| 5726|
| 11:00:00|12:00:00|-3.8934910974897816| 5710|
| 09:00:00|10:00:00| 22.41515848657947| 5702|
| 23:00:00|00:00:00| 34.76578133360086| 5696|
+---------+--------+-------------------+-----+
預期 Output:
+---------+--------+-------------------+-----+
|StartTime| EndTime| avgTemp|Total|
+---------+--------+-------------------+-----+
| 10:00 AM|11:00 AM|-16.314026481823376| 5726|
| 11:00 AM|12:00 PM|-3.8934910974897816| 5710|
| 09:00 AM|10:00 AM| 22.41515848657947| 5702|
| 23:00 PM|12:00 AM| 34.76578133360086| 5696|
+---------+--------+-------------------+-----+
您需要將每天的字符串 StartDate 和 EndDate 轉換為時間戳,然后以所需的格式再次轉換為字符串。
Las 4 withColumns 方法添加到您的原始代碼中
val daily = groupByWindow.withColumn("_tmp",split($"start"," ")).select($"_tmp".getItem(0).as("Date"),$"_tmp".getItem(1).as("StartTime"),$"end",$"avgTemp").withColumn("_tmp2",split($"end"," ")).select($"Date",$"StartTime",$"_tmp2".getItem(1).as("EndTime"),$"avgTemp")
.withColumn("StartTime", unix_timestamp($"StartTime", "HH:mm:ss"))
.withColumn("StartTime", from_unixtime($"StartTime", "HH:mm a"))
.withColumn("EndTime", unix_timestamp($"EndTime", "HH:mm:ss"))
.withColumn("EndTime", from_unixtime($"EndTime", "HH:mm a"))
然后您已經擁有的后續步驟:
daily.createOrReplaceTempView("myview")
spark.sqlContext.sql("Select StartTime,EndTime,avg(avgTemp) avgTemp,count(*) Total from myview group by StartTime,EndTime order by avgTemp ASC, total DESC")
Output
+---------+--------+-------+-----+
|StartTime| EndTime|avgTemp|Total|
+---------+--------+-------+-----+
| 06:00 AM|07:00 AM| 28.0| 1|
| 05:00 AM|06:00 AM| 30.9| 1|
| 04:00 AM|05:00 AM| 32.0| 1|
| 03:00 AM|04:00 AM| 34.0| 1|
| 00:00 AM|01:00 AM| 35.1| 1|
| 01:00 AM|02:00 AM| 35.1| 1|
| 02:00 AM|03:00 AM| 35.1| 1|
+---------+--------+-------+-----+
使用date_format()
- 將解決您的問題
scala> val daily = groupByWindow.withColumn("_tmp",split($"start"," ")).select($"_tmp".getItem(0).as("Date"),date_format($"_tmp".getItem(1),"hh:mm:ss a").as("startTime"),$"end",$"avgTemp").withColumn("_tmp2",spl it($"end"," ")).select($"Date",$"StartTime",date_format($"_tmp2".getItem(1),"hh:mm:ss a").as("EndTime"),$"avgTemp")
scala> daily.show
+----------+-----------+-----------+-------+
| Date| StartTime| EndTime|avgTemp|
+----------+-----------+-----------+-------+
|2000-01-01|01:30:00 AM|02:30:00 AM| 35.1|
|2000-01-01|03:30:00 AM|04:30:00 AM| 34.0|
|2000-01-01|02:30:00 AM|03:30:00 AM| 35.1|
|2000-01-01|06:30:00 AM|07:30:00 AM| 28.0|
|2000-01-01|12:30:00 AM|01:30:00 AM| 35.1|
|2000-01-01|05:30:00 AM|06:30:00 AM| 30.9|
|2000-01-01|04:30:00 AM|05:30:00 AM| 32.0|
+----------+-----------+-----------+-------+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.