2017-07-31 6 views
1

私はHH:MM:SS:Msのスパークデータフレーム列を秒単位で変換する方法は?

例えば、その値の時間分秒から火花データフレームの列を変換したいと思います「01:12:17.8370000」

コメントのために4337のおかげになります。

または "00:00:39.0390000"

は39秒になります。

私はこの質問を読んだことがありますが、私はこのコードを使って私のスパークデータフレーム列をどのように変換することができるのか分かりません。この

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

私はScalaの2.10.5を使用し、1.6

を刺激していますよう

Convert HH:mm:ss in seconds

何かが "継続は" の期間を含む列を想定すると、

+0

として出力を取得しなければならないような何かを行うことができますか? –

+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

あなたはudfを使用するよりも速く、効率的であるの利点を取ることができinbuilt functionsがあります関数

入力データフレームを

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

ので、あなたは

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

の下に、あなたが最初のタイムスタンプ値から3737秒を取得しましたか

+----------------+-------+ 
|duration  |seconds| 
+----------------+-------+ 
|01:12:17.8370000|4337 | 
|00:00:39.0390000|39  | 
+----------------+-------+ 
関連する問題