2017-07-31 105 views
1

我想從它的價值小時變換火花數據框柱分秒如何將HH:MM:SS:Ms的Spark Dataframe列轉換爲秒值?

E.g「01:12:17.8370000」

將成爲4337 S必填的評論。

或「00:00:39.0390000」

會變成39秒。

我已閱讀此問題,但我迷失在如何使用此代碼來轉換我的spark數據框列。

Convert HH:mm:ss in seconds

像這樣的事情

df.withColumn("duration",col("duration")....) 

我使用Scala的2.10.5和火花1.6

謝謝

+0

你是如何從第一時間戳值獲得3737秒輸出? –

+0

是的你是正確的我編輯我的變化 – gimp770

回答

3

如果你有一個字符串列,你可以寫一個UDF手動計算的:

val df = Seq("01:12:17.8370000", "00:00:39.0390000").toDF("duration")  

def str_sec = udf((s: String) => { 
    val Array(hour, minute, second) = s.split(":") 
    hour.toInt * 3600 + minute.toInt * 60 + second.toDouble.toInt 
}) 

df.withColumn("duration", str_sec($"duration")).show 
+--------+ 
|duration| 
+--------+  
| 4337| 
|  39| 
+--------+ 
2

假設列 「持續時間」 包含在持續時間字符串,你可以使用functions包的「unix_timestamp」函數來獲取傳遞模式的秒數:

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

val df = Seq("01:12:17.8370000", "00:00:39.0390000").toDF("duration") 

val newColumn = unix_timestamp(col("duration"), "HH:mm:ss") 
val result = df.withColumn("duration", newColumn) 
result.show 

+--------+ 
|duration| 
+--------+ 
| 4337| 
|  39| 
+--------+ 
+0

感謝您的迴應。例如,如果第1行的時間爲20分鐘,例如「00:02:00.00000」,當我將列添加回來時,這將始終與您的解決方案一起進入同一行。它會維持行的排序嗎? – gimp770

+0

我最終接受了另一個答案,這是我第一次在這裏問了一個問題,並得到了2個非常好的答案。謝謝我只是覺得使用他更容易,但是謝謝你的編輯,你的回答真的很感謝:)。 – gimp770

+0

@ gimp770我發現了一個更簡單的解決方案並更新了我的答案。請注意,由於Spark無法優化性能,因此並不總是建議使用UDF(與其他答案中一樣)。儘可能使用'sql.functions'包中的內置函數。 –

2

inbuilt functions你可以利用其中比使用udf速度更快,效率功能

給定輸入數據幀爲

+----------------+ 
|duration  | 
+----------------+ 
|01:12:17.8370000| 
|00:00:39.0390000| 
+----------------+ 

所以你可以做類似下面

df.withColumn("seconds", hour($"duration")*3600+minute($"duration")*60+second($"duration")) 

你應該得到的

+----------------+-------+ 
|duration  |seconds| 
+----------------+-------+ 
|01:12:17.8370000|4337 | 
|00:00:39.0390000|39  | 
+----------------+-------+ 
相關問題