2017-07-06 35 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