Scala Spark:如何将历元日期转换为日期对象
Spark:2.4.5带Scala 我在我的数据框中有一列,它保存了自epoch(1970)以来的天数。我正在寻找一种将其转换为日期列的方法 因此,我正在编写一个函数,如下所示:Scala Spark:如何将历元日期转换为日期对象,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,Spark:2.4.5带Scala 我在我的数据框中有一列,它保存了自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
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"),
from_unixtime(unix_timestamp(),"yyyy-MM-dd").as("date_3")
).show(false)
- 一天有86400秒。您可以将其与历元天数相乘,得到历元秒,然后使用\u 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|
#+---+----------+-------------------+
from_unixtime()//将unix历元(1970-01-01 00:00:00 UTC)的秒数转换为字符串。我拥有的是几天而不是几秒钟。所以这个函数将导致不正确的值我正在从Java中查找LocalDate of epochDay(long epochDay),我已经尝试过了,但这对我不起作用。o/p数据总是比实际少1天,这复制了LocalDate.ofEpochDay的确切行为。但是,如果您想要不同的行为,您可以在与86400相乘之前在epochDay中加/减1。