2017-07-31 65 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  | 
+----------------+-------+ 
相关问题