如何解决Spark:如何将纪元天转换为Date对象
Spark:使用Scala 2.4.5
我的数据框中有一个列,该列保存自epoch(1970年)以来的天数。我正在寻找一种将其转换为日期列的方法。
所以我正在编写如下函数:
def from_epochday(epochDays: Column):Column = {
date_add(to_date(lit("1970-01-01"),"YYYY-MM-DD"),epochDays /* Need to int and not a Column*/)
}
数据框将具有:
df.withColumn("dob",from_epochday(col(epochDays)))
问题是date_add以Int作为输入,但我无法弄清楚如何将值作为Int。
可能我可以通过UDF函数来做到这一点,但并不想避免这种情况。
解决方法
val df = Seq(1).toDF("seq").select(
from_unixtime(unix_timestamp(),"MM-dd-yyyy").as("date_1"),from_unixtime(unix_timestamp(),"dd-MM-yyyy HH:mm:ss").as("date_2"),"yyyy-MM-dd").as("date_3")
).show(false)
,
一天中有86400
秒。您可以将其乘以时代天数以得到时代秒数,然后使用from_unixtime
。
scala> java.time.LocalDate.ofEpochDay(1)
res16: java.time.LocalDate = 1970-01-02
scala> java.time.LocalDate.ofEpochDay(2)
res17: java.time.LocalDate = 1970-01-03
scala> val df = Seq(1,2).toDF("days")
df: org.apache.spark.sql.DataFrame = [days: int]
scala> df.withColumn("date",from_unixtime(col("days")*86400,"yyyy-MM-dd").cast("date")).show
+----+----------+
|days| date|
+----+----------+
| 1|1970-01-02|
| 2|1970-01-03|
+----+----------+
,
这是您可以执行的另一种方法。
df = spark.createDataFrame(
[
(1,18508),],schema=StructType(
[
StructField('Id',StringType(),True),StructField('Epoch_days',LongType(),True)
]
)
)
df.withColumn(
'date',(col('Epoch_days')*86400).cast('timestamp')
).show(truncate=False)
#+---+----------+-------------------+
#|Id |Epoch_days|date |
#+---+----------+-------------------+
#|1 |18508 |2020-09-03 00:00:00|
#+---+----------+-------------------+
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。