2017-09-12 21 views
2

有沒有辦法將納秒級的時間戳值轉換爲火花中的時間戳。我從csv文件獲得輸入,並且timstamp值的格式爲 12-12-2015 14:09:36.992415+01:00。這是我試過的代碼。將納秒級的字符串轉換爲火花中的時間戳

val date_raw_data = List((1, "12-12-2015 14:09:36.992415+01:00")) 

val dateraw_df = sc.parallelize(date_raw_data).toDF("ID", "TIMESTAMP_VALUE") 

val ts = unix_timestamp($"TIMESTAMP_VALUE", "MM-dd-yyyy HH:mm:ss.ffffffz").cast("double").cast("timestamp") 

val date_df = dateraw_df.withColumn("TIMESTAMP_CONV", ts).show(false) 

輸出是

+---+-----------------------+---------------------+ 
|ID |TIMESTAMP_VALUE  |TIMESTAMP_CONV  | 
+---+-----------------------+---------------------+ 
|1 |12-12-2015 14:09:36.992|null     | 
+---+-----------------------+---------------------+ 

我能時間戳轉換使用格式MM-dd-yyyy HH:mm:ss.SSS毫秒。麻煩與納秒和時區格式。

+0

輸出在TIMESTAMP_CONV列上的一個更正爲空,這意味着轉換失敗。 – Abin

+0

您可以嘗試提供自定義架構爲CSV列值作爲時間戳 –

+0

我試圖使用自定義架構 ' import org.apache.spark.sql.types._; VAL customSchema = StructType( SEQ(StructField( 「ID」,DataTypes.IntegerType,真), StructField( 「TIMESTAMP_VALUE」,DataTypes.TimestampType,真) ) ); ' 但現在我得到錯誤_java.lang.ClassCastException:scala.Tuple2不能轉換爲java.lang.Integer_ – Abin

回答

0

unix_timestamp不會在這裏做。事件如果你能解析字符串(據我所知SimpleDateFormat不提供所需的格式),unix_timestamphas only second precision(重點煤礦):

def unix_timestamp(s: Column, p: String): Column

轉換時間字符串以給定模式(見[http://docs.oracle.com/javase/tutorial/i18n/format/simpleDateFormat.html])爲Unix時間(,以秒爲單位),如果失敗則返回null。

你必須創建自己的函數來解析這些數據。一個大概的想法:

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

def to_nano(c: Column) = { 
    val r = "([0-9]{2}-[0-9]{2}-[0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2})(\\.[0-9]*)(.*)$" 
    // seconds part 
    (unix_timestamp(
    concat(
     regexp_extract($"TIMESTAMP_VALUE", r, 1), 
     regexp_extract($"TIMESTAMP_VALUE", r, 3) 
    ), "MM-dd-YYYY HH:mm:ssXXX" 
).cast("decimal(38, 9)") + 
    // subsecond part 
    regexp_extract($"TIMESTAMP_VALUE", r, 2).cast("decimal(38, 9)")).alias("value") 
} 

Seq("12-12-2015 14:09:36.992415+01:00").toDF("TIMESTAMP_VALUE") 
    .select(to_nano($"TIMESTAMP_COLUMN").cast("timestamp")) 
    .show(false) 

// +--------------------------+ 
// |value      | 
// +--------------------------+ 
// |2014-12-28 14:09:36.992415| 
// +--------------------------+ 
相關問題