在sparkDataframe中将时间戳转换为日期

t30tvxxf  于 2021-07-12  发布在  Spark
关注(0)|答案(7)|浏览(1026)

我见过(这里:如何在dataframe中将时间戳转换为日期格式?)在datetype中转换时间戳的方法,但是,至少对我来说,它不起作用。
以下是我尝试过的:


# Create dataframe

df_test = spark.createDataFrame([('20170809',), ('20171007',)], ['date',])

# Convert to timestamp

df_test2 = df_test.withColumn('timestamp',func.when((df_test.date.isNull() | (df_test.date == '')) , '0')\
.otherwise(func.unix_timestamp(df_test.date,'yyyyMMdd')))\

# Convert timestamp to date again

df_test2.withColumn('date_again', df_test2['timestamp'].cast(stypes.DateType())).show()

但这在列中返回null date_again :

+--------+----------+----------+
|    date| timestamp|date_again|
+--------+----------+----------+
|20170809|1502229600|      null|
|20171007|1507327200|      null|
+--------+----------+----------+

知道什么失败了吗?

hwamh0ep

hwamh0ep1#

以下内容:

func.when((df_test.date.isNull() | (df_test.date == '')) , '0')\
  .otherwise(func.unix_timestamp(df_test.date,'yyyyMMdd'))

不起作用,因为它的类型不一致-第一个子句返回 string 当第二个子句返回时 bigint . 结果它总是会回来 NULL 如果 dataNOT NULL 不是空的。
它也是过时的-sql函数 NULL 格式错误的文件。不需要额外的检查。

In [1]: spark.sql("SELECT unix_timestamp(NULL, 'yyyyMMdd')").show()
+----------------------------------------------+
|unix_timestamp(CAST(NULL AS STRING), yyyyMMdd)|
+----------------------------------------------+
|                                          null|
+----------------------------------------------+

In [2]: spark.sql("SELECT unix_timestamp('', 'yyyyMMdd')").show()
+--------------------------+
|unix_timestamp(, yyyyMMdd)|
+--------------------------+
|                      null|
+--------------------------+

在spark 2.2或更高版本中不需要中间步骤:

from pyspark.sql.functions import to_date

to_date("date", "yyyyMMdd")
hmtdttj4

hmtdttj42#

你应该做以下工作

>>> df_test2.withColumn('date_again', func.from_unixtime('timestamp').cast(DateType())).show()
+--------+----------+----------+
|    date| timestamp|date_again|
+--------+----------+----------+
|20170809|1502216100|2017-08-09|
|20171007|1507313700|2017-10-07|
+--------+----------+----------+

模式是

>>> df_test2.withColumn('date_again', func.from_unixtime('timestamp').cast(DateType())).printSchema()
root
 |-- date: string (nullable = true)
 |-- timestamp: string (nullable = true)
 |-- date_again: date (nullable = true)
b4qexyjb

b4qexyjb3#

对于Pypark:
假设您有一个字段名:“datetime”,它将日期显示为日期和时间
向df添加一个新字段,该字段显示“dateonly”列,如下所示:

from pyspark.sql.functions  import date_format
    df.withColumn("DateOnly", date_format('DateTime', "yyyyMMdd")).show()

这将在df中显示一个名为dateonly的新列,日期为yyyymmdd格式

xurqigkl

xurqigkl4#

转换 unix_timestamp 列(称为 TIMESTMP )在PyparkDataframe中( df )--到 Date 类型:
以下是两步流程(可能有一个较短的方法):
从unix时间戳转换为 timestamp 转换自 timestampDate 最初 df.printShchema() 显示: -- TIMESTMP: long (nullable = true) 使用 spark.SQL 实现如下转换:

df.registerTempTable("dfTbl")

dfNew= spark.sql("""
                     SELECT *, cast(TIMESTMP as Timestamp) as newTIMESTMP 
                     FROM dfTbl d
                  """)

dfNew.printSchema()

printschema()将显示:

-- newTIMESTMP: timestamp (nullable = true)

最后将类型从 timestampDate 具体如下:

from pyspark.sql.types import DateType
dfNew=dfNew.withColumn('actual_date', dfNew['newTIMESTMP'].cast(DateType()))
dzhpxtsq

dzhpxtsq5#


# udf to convert the ts to timestamp

get_timestamp = udf(lambda x : datetime.datetime.fromtimestamp(x/ 1000.0).strftime("%Y-%m-%d %H:%M:%S"))

# apply this udf in the dataframe with your timestamp

df_withdate = df.withColumn("datetime", get_timestamp(df.ts))
whhtz7ly

whhtz7ly6#

他们把我的问题作为这个问题的副本关闭了,所以我会把我的答案复制粘贴到这里(是副本吗?)
因为timestamp列是以毫秒为单位的,所以只需将其转换为秒并将其转换为 TimestampType 这样就可以了:

from pyspark.sql.types import TimestampType
import pyspark.sql.functions as F

df.select( 
      (F.col("my_timestamp") / 1000).cast(TimestampType())
)
k5ifujac

k5ifujac7#

一个没有 import TimestampType :

import pyspark.sql.functions as F

F.from_unixtime(F.col('date_col') / 1000).cast('date')

相关问题