spark:如何将历元日期转换为日期对象

sigwle7e  于 2021-05-27  发布在  Spark
关注(0)|答案(3)|浏览(458)

spark:2.4.5带scala
我的Dataframe中有一个列,它保存自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*/)
  }

Dataframe将具有:

df.withColumn("dob", from_epochday(col(epochDays)))

问题是date\u add以int作为输入,我不知道如何获得int值。
也许我可以通过udf函数来实现,但我不会试图避免。

yfwxisqw

yfwxisqw1#

一天过去了 86400 几秒钟。你可以把它和epoch天相乘得到epoch秒,然后使用 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|
+----+----------+
gmxoilav

gmxoilav2#

这是另一种方法。

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|

# +---+----------+-------------------+
ykejflvf

ykejflvf3#

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)

https://sparkbyexamples.com/spark/spark-epoch-time-to-timestamp-date/

相关问题