2016-08-22 12 views
8

私はPySpark 1.58.0を使用しています。 私はdatetime値の列の行に異常な文字列形式を持っています。それは次のようになります。PySparkデータフレームが異常な文字列形式をタイムスタンプに変換する

Row[(daytetime='2016_08_21 11_31_08')] 

タイムスタンプには、この異例のyyyy_mm_dd hh_mm_dd形式を変換する方法はありますか? 結局

df = df.withColumn("date_time",df.daytetime.astype('Timestamp')) 

の線に沿って来ることができる何かが私はregexp_replaceのようなスパークSQL関数が動作することができると思っていましたが、もちろん、私は中:と日付の半分 と_-_を交換する必要があります時間部分。 substringを使用して2で列を分割し、時間の終わりから数えてカウントできると思っていました。次に、 'regexp_replace'を別々に行い、次に連結します。しかし、これは多くの操作に見えますか?簡単な方法がありますか?

答えて

15

スパーク> = 2.2

from pyspark.sql.functions import to_timestamp 

(sc 
    .parallelize([Row(dt='2016_08_21 11_31_08')]) 
    .toDF() 
    .withColumn("parsed", to_timestamp("dt", "yyyy_MM_dd hh_mm_ss")) 
    .show(1, False)) 

## +-------------------+-------------------+ 
## |dt     |parsed    | 
## +-------------------+-------------------+ 
## |2016_08_21 11_31_08|2016-08-21 11:31:08| 
## +-------------------+-------------------+ 

スパーク< 2.2

それはunix_timestampを扱うことができないものではありません:

from pyspark.sql import Row 
from pyspark.sql.functions import unix_timestamp 

(sc 
    .parallelize([Row(dt='2016_08_21 11_31_08')]) 
    .toDF() 
    .withColumn("parsed", unix_timestamp("dt", "yyyy_MM_dd hh_mm_ss") 
    .cast("double") 
    .cast("timestamp")) 
    .show(1, False)) 

## +-------------------+---------------------+ 
## |dt     |parsed    | 
## +-------------------+---------------------+ 
## |2016_08_21 11_31_08|2016-08-21 11:31:08.0| 
## +-------------------+---------------------+ 
+0

だから私は実際には正しい結果を得ていませんよ。 ................................ df1 = df1.withColumn( "dayte_time"、unix_timestamp( "daytetime"、 "yyyy_MM_dd hh_mm_ss")。 df1 = df1.withColumn( "date_time"、df1.dayte_time.astype( "String")) ---------- -------------------------------------------------- -------------------- [行(daytetime = '2016_08_22 23_18_51'、idnbr = 223338299392、dayte_time = datetime.datetime(1970、1、18、0、51 、47、931000)、date_time = '1970-01-18 00:51:47.931') – PR102012

+0

申し訳ありませんが、私は1.5がバグだったことを忘れています。 .cast( "timestamp") ' – zero323

+0

はい、完璧です。 '.cast( "double")は先に働いた。 – PR102012

関連する問題