簡體   English   中英

Spark Scala - 字符串到時間戳

[英]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.

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