【问题标题】:Reparse date in pyspark without udf [duplicate]在没有udf的pyspark中重新解析日期[重复]
【发布时间】:2019-03-26 08:00:48
【问题描述】:

我正在尝试通过将 dd/mm/yyyy 替换为 yyyy-mm-dd 来解析 pyspark 中的日期列。

import pyspark.sql.functions as F
spark = SparkSession.builders.appName('test').getOrCreate()
sc = spark.sparkContext
sqlc = pyspark.sql.SQLContext(sc)

df = sqlc.createDataFrame([('01/01/2018','user1'),('28/02/2017','user2')], ['Date','user'])
df.show()
+----------+-----+
|      Date| user|
+----------+-----+
|01/01/2018|user1|
|28/02/2017|user2|
+----------+-----+

到目前为止我所做的是:

df.select( F.concat_ws('-',F.split(F.col('Date'),'/')).alias('Date_parsed')).show()
+-----------+
|Date_parsed|
+-----------+
| 01-01-2018|
| 28-02-2017|
+-----------+

我想得到的是:

+-----------+
|Date_parsed|
+-----------+
| 2018-01-01|
| 2017-02-28|
+-----------+

知道如何在不使用 udf 的情况下执行此操作吗?

【问题讨论】:

  • 很好,不过,这里还有一个关于更改日期列显示的解析的问题。 Ali Yesilli 给出的函数to_date 完美运行。

标签: arrays pyspark reverse


【解决方案1】:

这种情况可以使用sql函数

>>> import pyspark.sql.functions as F
>>> 
>>> df.show()
+----------+-----+
|      Date| user|
+----------+-----+
|01/01/2018|user1|
|28/02/2017|user2|
+----------+-----+

>>> df.withColumn('Date',F.date_format(F.to_date('Date','dd/MM/yyyy'),'yyyy-MM-dd')).show()
+----------+-----+
|      Date| user|
+----------+-----+
|2018-01-01|user1|
|2017-02-28|user2|
+----------+-----+

更新:请注意,在某些版本的 spark(例如 2.1.1)中,to_date 不将格式化作为参数,那么您可以使用 F.unix_timestamp 预先格式化日期列:

df.withColumn('Date',F.date_format(F.to_date(
            F.unix_timestamp(F.col('Date'),'dd/MM/yyyy').cast('timestamp')
                                             ),'yyyy-MM-dd')).show()

【讨论】:

  • 我试过使用它,不幸的是我得到了错误:TypeError: to_date() takes exactly 1 argument (2 given)。请注意,我使用的是 spark 2.1.1。
  • 我认为是因为 Spark 版本。试试这个 df.withColumn('Date', F.date_format(F.unix_timestamp('Date', 'dd/MM/yyyy').cast("timestamp"),'yyyy-MM-dd')).show( )
  • 这很好用,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
相关资源
最近更新 更多