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

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

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

  1. # Create dataframe
  2. df_test = spark.createDataFrame([('20170809',), ('20171007',)], ['date',])
  3. # Convert to timestamp
  4. df_test2 = df_test.withColumn('timestamp',func.when((df_test.date.isNull() | (df_test.date == '')) , '0')\
  5. .otherwise(func.unix_timestamp(df_test.date,'yyyyMMdd')))\
  6. # Convert timestamp to date again
  7. df_test2.withColumn('date_again', df_test2['timestamp'].cast(stypes.DateType())).show()

但这在列中返回null date_again :

  1. +--------+----------+----------+
  2. | date| timestamp|date_again|
  3. +--------+----------+----------+
  4. |20170809|1502229600| null|
  5. |20171007|1507327200| null|
  6. +--------+----------+----------+

知道什么失败了吗?

hwamh0ep

hwamh0ep1#

以下内容:

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

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

  1. In [1]: spark.sql("SELECT unix_timestamp(NULL, 'yyyyMMdd')").show()
  2. +----------------------------------------------+
  3. |unix_timestamp(CAST(NULL AS STRING), yyyyMMdd)|
  4. +----------------------------------------------+
  5. | null|
  6. +----------------------------------------------+
  7. In [2]: spark.sql("SELECT unix_timestamp('', 'yyyyMMdd')").show()
  8. +--------------------------+
  9. |unix_timestamp(, yyyyMMdd)|
  10. +--------------------------+
  11. | null|
  12. +--------------------------+

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

  1. from pyspark.sql.functions import to_date
  2. to_date("date", "yyyyMMdd")
展开查看全部
hmtdttj4

hmtdttj42#

你应该做以下工作

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

模式是

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

b4qexyjb3#

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

  1. from pyspark.sql.functions import date_format
  2. 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 实现如下转换:

  1. df.registerTempTable("dfTbl")
  2. dfNew= spark.sql("""
  3. SELECT *, cast(TIMESTMP as Timestamp) as newTIMESTMP
  4. FROM dfTbl d
  5. """)
  6. dfNew.printSchema()

printschema()将显示:

  1. -- newTIMESTMP: timestamp (nullable = true)

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

  1. from pyspark.sql.types import DateType
  2. dfNew=dfNew.withColumn('actual_date', dfNew['newTIMESTMP'].cast(DateType()))
展开查看全部
dzhpxtsq

dzhpxtsq5#

  1. # udf to convert the ts to timestamp
  2. get_timestamp = udf(lambda x : datetime.datetime.fromtimestamp(x/ 1000.0).strftime("%Y-%m-%d %H:%M:%S"))
  3. # apply this udf in the dataframe with your timestamp
  4. df_withdate = df.withColumn("datetime", get_timestamp(df.ts))
whhtz7ly

whhtz7ly6#

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

  1. from pyspark.sql.types import TimestampType
  2. import pyspark.sql.functions as F
  3. df.select(
  4. (F.col("my_timestamp") / 1000).cast(TimestampType())
  5. )
k5ifujac

k5ifujac7#

一个没有 import TimestampType :

  1. import pyspark.sql.functions as F
  2. F.from_unixtime(F.col('date_col') / 1000).cast('date')

相关问题