【问题标题】:How can I split a timestamp column into date and time in spark如何在火花中将时间戳列拆分为日期和时间
【发布时间】:2017-08-11 21:02:40
【问题描述】:

我想将时间戳值拆分为日期和时间。

例如:

1/20/2016 3:20:30 PM
1/20/2016 3:20:31 PM
1/20/2016 3:20:32 PM
1/20/2016 3:20:32 PM
1/20/2016 3:20:32 PM
1/20/2016 3:20:33 PM
1/20/2016 3:20:34 PM
1/20/2016 3:20:34 PM

需要拆分为 1/20/2016 和 3:20:30 PM

使用 sql 溢出函数我无法正确处理它

split_col = pyspark.sql.functions.split(df['ServerTime'], ' ')
df_date = df.withColumn('Date', split_col.getItem(0))
df_time = df.withColumn('Time', split_col.getItem(1))

有帮助吗????

【问题讨论】:

  • 你遇到了什么错误?

标签: pyspark


【解决方案1】:

由于日期和时间可以采用任何格式,因此正确的做法是将日期字符串转换为 Datetype() 并从中提取日期和时间部分。

让我们来看看下面的样本数据

server_times = sc.parallelize([('1/20/2016 3:20:30 PM',),
                     ('1/20/2016 3:20:31 PM',),
                     ('1/20/2016 3:20:32 PM',)]).toDF(['ServerTime'])

DateTime 部分可以提取如下任何格式。

from pyspark.sql.functions import unix_timestamp, from_unixtime, date_format

df.select(unix_timestamp(df.ServerTime, 'm/d/yyyy h:m:ss a').alias('ut'))\
  .select(from_unixtime('ut').alias('dty'))\
  .select(date_format('dty', 'M/d/yyyy').alias('Date'),
          date_format('dty', 'h:m:s a').alias('Time'))\
  .show()

+---------+----------+
|     Date|      Time|
+---------+----------+
|1/20/2016|3:20:30 PM|
|1/20/2016|3:20:31 PM|
|1/20/2016|3:20:32 PM|
+---------+----------+

如果需要,您可以将这两个投影到单独的数据帧中。

【讨论】:

  • 如何改进代码以包括服务器时间
【解决方案2】:

您可以使用pyspark.sql.functions.concat 再次将相关时间位连接在一起。我们先创建一些测试数据:

df = sc.parallelize([('1/20/2016 3:20:30 PM',),
                     ('1/20/2016 3:20:31 PM',),
                     ('1/20/2016 3:20:32 PM',)]).toDF(['ServerTime'])    

你可以这样做:

import pyspark.sql.functions as F
split_col = pyspark.sql.functions.split(df['ServerTime'], ' ')
df_date = df.withColumn('Date', split_col.getItem(0))
df_time = df.withColumn('Time', F.concat(split_col.getItem(1),F.lit(' '),split_col.getItem(2)))

运行df_time.show()后,返回如下输出:

+--------------------+----------+
|          ServerTime|      Time|
+--------------------+----------+
|1/20/2016 3:20:30 PM|3:20:30 PM|
|1/20/2016 3:20:31 PM|3:20:31 PM|
|1/20/2016 3:20:32 PM|3:20:32 PM|
+--------------------+----------+

运行df_date.show() 返回:

+--------------------+---------+
|          ServerTime|     Date|
+--------------------+---------+
|1/20/2016 3:20:30 PM|1/20/2016|
|1/20/2016 3:20:31 PM|1/20/2016|
|1/20/2016 3:20:32 PM|1/20/2016|
+--------------------+---------+

【讨论】:

  • 不适用于“1/1/2016 3:20:30 PM”或“1/20/2016 11:20:30 PM”等日期时间
猜你喜欢
  • 2021-12-19
  • 2016-06-06
  • 2021-07-27
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
  • 2021-11-08
相关资源
最近更新 更多