使用pyspark将字符串转换为日期时间时出现空值

ego6inou  于 2022-11-28  发布在  Spark
关注(0)|答案(3)|浏览(198)

我最近开始在数据块上使用pyspark,有趣的是,当我将下面的字符串转换为DateTime数据类型时,我得到了NULL值。我在这里查看了几篇关于如何做到这一点的文章,但似乎没有一篇对我有效。
样本数据

invoiceId  quantity invoicedate
     001         34     12/1/2010 8:26
     003         10     12/2/2010 8:26
     004         10     30/2/2010 8:26

我正在尝试使用pyspark将invoicedate(字符串数据类型)转换为DateTime数据类型

f0brbegy

f0brbegy1#

    • 以spark 3.0为例进行了更新**

此解决方案适用于spark 2,因为它使用Java SimpleDateFormat作为to_timestamp的日期时间模式

import pyspark.sql.functions as f

df.select(
    f.to_timestamp(f.col('invoicedate'), 'dd/MM/yyyy HH:mm').alias('some date')
)

在spark 3中,to_timestamp使用自己的dateformat,它比spark 2中更严格,所以如果你的日期与datetime模式不匹配,你会得到错误(就像你的例子)。
所以你有两个选择与Spark3:
1.设置属性"spark. sql. legacy. timeParserPolicy"="LEGACY",并使用上面示例中的代码。
1.根据spark3 dateformat指定模式。如下所示:

df.select(
    f.to_timestamp(f.col('invoicedate'), 'd/M/y H:m').alias('some date')
)

无论如何,你会得到空的30/2/2010 8:26,因为没有30天在二月。

enxuqcxy

enxuqcxy2#

我将以下代码添加到@阿尔特姆Astashov提供的代码中,它工作了

import pyspark.sql.functions as f
spark.sql("set spark.sql.legacy.timeParserPolicy=LEGACY") # this bit 
resolves the issues

df.select(
f.to_timestamp(f.col('invoicedate'), 'dd/MM/yyyy HH:mm').alias('some date'))
mqkwyuun

mqkwyuun3#

我一直在处理一个类似的问题,发现我试图使用不适用于unix时间戳的字符串格式。我有一个日期字符串,看起来像:

Fri Nov 16 23:38:16 +0000 2018

我不明白为什么我不能从pyspark.sql.functions中得到to_date或date_format函数,最后我发现要做到这一点的方法是使用unix_time函数。所以我尝试提供一个字符串格式,看起来像这样:

"%a %b %d %H:%M:%S %z %Y"

但我需要使用unix_timestamp格式,即:

"EEE MMM d HH:mm:ss z yyyy"

使用正确的时间戳格式,然后使用下面的代码对我的 Dataframe "df"工作,该 Dataframe 包含一个列"created_at",其日期字符串格式如上所述。
df.selectF.从unixtime(F.unix时间戳('创建时间','EEE MMM d HH:mm:ss z yyyy')))
我终于找到了这一点后,挖掘了一点对这个有用的stackoverflow文章在这里:How to parse twitter date time string in pyspark?

相关问题