2016-08-22 63 views
8

我通过Spark 1.5.0使用PySpark。 我在日期时间值列的行中有一个不寻常的字符串格式。它看起来像这样: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”)。cast(“timestamp”)) 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

之前投了两倍或乘以1000是的,完美的。 '.cast(“double”)'提前工作。 – PR102012

相关问题