2017-07-06 1037 views
1

雖然我嘗試在Spark DataFrame中將字符串字段強制轉換爲TimestampType,但輸出值的精度爲微秒(yyyy-MM-dd HH:mm:ss.S)。但我需要的格式是yyyy-MM-dd HH:mm:ss即,不包括微秒精度。另外,我想在寫入實木複合地板文件時將其保存爲時間戳字段。 所以我的字段的數據類型應該是使用TimestampType格式yyyy-MM-dd HH:mm:ss的時間戳格式化Spark中的TimestampType DataFrame-斯卡拉

我嘗試作爲

col("column_A").cast(TimestampType) 
or 
col("column_A").cast("timestamp") 

投領域的時間戳。這些能夠將該字段投射到時間戳,但具有微秒精度。

任何人都可以幫助保存時間戳數據類型爲具有所需格式規格的實木複合地板文件。
編輯
輸入:

val a = sc.parallelize(List(("a", "2017-01-01 12:02:00.0"), ("b", "2017-02-01 11:22:30"))).toDF("cola", "colb") 
scala> a.withColumn("datetime", date_format(col("colb"), "yyyy-MM-dd HH:mm:ss")).show(false) 
+----+---------------------+-------------------+ 
|cola|colb     |datetime   | 
+----+---------------------+-------------------+ 
|a |2017-01-01 12:02:00.0|2017-01-01 12:02:00| 
|b |2017-02-01 11:22:30 |2017-02-01 11:22:30| 
+----+---------------------+-------------------+ 


scala> a.withColumn("datetime", date_format(col("colb"), "yyyy-MM-dd HH:mm:ss")).printSchema 
root 
|-- cola: string (nullable = true) 
|-- colb: string (nullable = true) 
|-- datetime: string (nullable = true) 

在上面,我們正在正確的時間戳格式,但是,當我們打印模式,日期時間字段的類型爲String,但我需要一個時間戳在這裏輸入。

現在,如果我試圖將該字段強制轉換爲時間戳,則該格式將設置爲微秒精度,這並非意圖。

scala> import org.apache.spark.sql.types._ 
import org.apache.spark.sql.types._ 

scala> val a = sc.parallelize(List(("a", "2017-01-01 12:02:00.0"), ("b", "2017-02-01 11:22:30"))).toDF("cola", "colb") 
a: org.apache.spark.sql.DataFrame = [cola: string, colb: string] 

scala> a.withColumn("datetime", date_format(col("colb").cast(TimestampType), "yyyy-MM-dd HH:mm:ss").cast(TimestampType)).show(false) 
+----+---------------------+---------------------+ 
|cola|colb     |datetime    | 
+----+---------------------+---------------------+ 
|a |2017-01-01 12:02:00.0|2017-01-01 12:02:00.0| 
|b |2017-02-01 11:22:30 |2017-02-01 11:22:30.0| 
+----+---------------------+---------------------+ 


scala> a.withColumn("datetime", date_format(col("colb").cast(TimestampType), "yyyy-MM-dd HH:mm:ss").cast(TimestampType)).printSchema 
root 
|-- cola: string (nullable = true) 
|-- colb: string (nullable = true) 
|-- datetime: timestamp (nullable = true) 

我所期待是格式是在yyyy-MM-dd HH:mm:ss,也是字段的數據類型事先是timestamp 感謝

+1

你能提供樣本字符串字段嗎? –

+0

@RameshMaharjan提供和編輯中的示例。 – SrinivasR

+0

如果您投射時間戳毫秒,肯定會追加。所以如果你需要架構作爲時間戳,那麼你將不得不調整毫秒。如果你不想要毫秒,那麼把它保存爲字符串。 :) –

回答

0

您可以使用unix_timestamp的字符串轉換日期時間爲timestamp 。

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

val format = "yyyy-MM-dd HH:mm:ss" 
dataframe.withColumn("column_A", unix_timestamp($"date", format)) 

希望這有助於!

+0

謝謝你的迴應。這給出了除時間戳以外的字段column_A的數據類型。如果有幫助,我已經用一個例子期望編輯了這個問題。 – SrinivasR