如何使用scala中的日期替换DataFrame中的epoch列

时间:2016-05-03 07:35:32

标签: scala apache-spark dataframe

我正在写一个接收avro记录的spark应用程序。我正在将该avro记录转换为Spark DataFrame(df)对象。 df包含时间戳属性,以秒为单位。 (大纪元时间)

我想用date列替换seconds列。 怎么做?

我的代码段是:

val df = sqlContext.read.avro("/root/Work/PixelReporting/input_data/pixel.avro")
val pixelGeoOutput = df.groupBy("current_time", "pixel_id", "geo_id", "operation_type", "is_piggyback").count()
pixelGeoOutput.write.json("/tmp/pixelGeo")

“current_time”现在是几秒钟。我想把它转换成日期。

3 个答案:

答案 0 :(得分:3)

自Spark 1.5以来,内置sql.function名为from_unixtime,您可以这样做:

val df = Seq(Tuple1(1462267668L)).toDF("epoch")
df.withColumn("date", from_unixtime(col("epoch")))

答案 1 :(得分:1)

谢谢你们, 我用withColumn方法来解决我的问题。

代码段是:

val newdf = df.withColumn("date", epochToDateUDF(df("current_time")))
def epochToDateUDF = udf((current_time : Long)  =>{
DateTimeFormat.forPattern("YYYY-MM-dd").print(current_time *1000)
})

答案 2 :(得分:0)

这应该会给你一个想法:

import java.util.Date
val df = sc.parallelize(List(1462267668L, 1462267672L, 1462267678L)).toDF("current_time")
val dfWithDates = df.map(row => new Date(row.getLong(0) * 1000))
dfWithDates.collect()

输出:

Array[java.util.Date] = Array(Tue May 03 11:27:48 CEST 2016, Tue May 03 11:27:52 CEST 2016, Tue May 03 11:27:58 CEST 2016)

您也可以在UDF中尝试此操作,并使用withColumn来替换该单个列。