我有一个带有一列unix时间戳的数据框(例如,1435655706000),我想将其转换为格式为'yyyy-MM-DD'的数据,我试过nscala - 时间,但它不起作用。
val time_col = sqlc.sql("select ts from mr").map(_(0).toString.toDateTime)
time_col.collect().foreach(println)
我收到错误: java.lang.IllegalArgumentException:格式无效:" 1435655706000"在" 6000"
时格格不入答案 0 :(得分:23)
自spark1.5起,就有了内置的UDF。
val df = sqlContext.sql("select from_unixtime(ts,'YYYY-MM-dd') as `ts` from mr")
请查看Spark 1.5.2 API Doc了解详情。
答案 1 :(得分:16)
这里使用的是Scala DataFrame函数:from_unixtime和to_date
// NOTE: divide by 1000 required if milliseconds
// e.g. 1446846655609 -> 2015-11-06 21:50:55 -> 2015-11-06
mr.select(to_date(from_unixtime($"ts" / 1000)))
答案 2 :(得分:13)
val stri = new DateTime(timeInMillisec).toDateTime.toString("yyyy/MM/dd")
您需要导入以下库。
val time_col = sqlContext.sql("select ts from mr")
.map(line => new DateTime(line(0).toInt).toDateTime.toString("yyyy/MM/dd"))
或根据你的情况调整:
import com.github.nscala_time.time.Imports._
val date = (new DateTime() + ((threshold.toDouble)/1000).toInt.seconds )
.toString("yyyy/MM/dd")
可能有另一种方式:
{{1}}
希望这会有所帮助:)
答案 3 :(得分:6)
我已使用joda-time库通过DataFrame
上的映射并将DateTime
转换为字符串来解决此问题:
import org.joda.time._
val time_col = sqlContext.sql("select ts from mr")
.map(line => new DateTime(line(0)).toString("yyyy-MM-dd"))
答案 4 :(得分:6)
在使用nscala_time
应用toDataTime之前,无需转换为String import com.github.nscala_time.time.Imports._
scala> 1435655706000L.toDateTime
res4: org.joda.time.DateTime = 2015-06-30T09:15:06.000Z
`
答案 5 :(得分:1)
您可以在Java中使用以下语法
input.select("timestamp)
.withColumn("date", date_format(col("timestamp").$div(1000).cast(DataTypes.TimestampType), "yyyyMMdd").cast(DataTypes.IntegerType))
答案 6 :(得分:0)
您可以做的是:
input.withColumn("time", concat(from_unixtime(input.col("COL_WITH_UNIX_TIME")/1000,
"yyyy-MM-dd'T'HH:mm:ss"), typedLit("."), substring(input.col("COL_WITH_UNIX_TIME"), 11, 3),
typedLit("Z")))
其中time是新的列名称,而COL_WITH_UNIX_TIME是要转换的列的名称。这将以毫秒为单位提供数据,使您的数据更加准确,例如:"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"