如何在pyspark中解析Twitter日期时间字符串?

时间:2019-05-03 13:31:48

标签: twitter pyspark apache-spark-sql pyspark-sql

我的数据在pyspark数据框('pyspark.sql.dataframe.DataFrame')中。其中一列具有以Twitter字符串格式存储的日期时间。

我找到了一些针对python的解决方案,但没有针对pyspark的特定解决方案。

这是专栏的样子。

+------------------------------+----+
|created_at(string format)     |date|
+------------------------------+----+
|Tue Mar 26 02:29:54 +0000 2019|null|
|Tue Mar 26 02:29:54 +0000 2019|null|
|Tue Mar 26 02:29:54 +0000 2019|null|
|Tue Mar 26 02:29:54 +0000 2019|null|
|Tue Mar 26 02:29:54 +0000 2019|null|
+------------------------------+----+

我尝试了以下解决方案,但没有成功

date_df = df.select('created_at', from_unixtime(unix_timestamp('created_at', '%a %b %d %H:%M:%S %z %Y')).alias('date'))

我需要将该列转换为spark datetime / timestamp类型,以便可以在其之上执行其他datetime和spark.sql操作。

4 个答案:

答案 0 :(得分:0)

我无法提供所提供的任何解决方案。显然pyspark.sql上的to_timestamp()函数以某种格式读取输入。提供格式的所有尝试均未产生任何结果。因此,使用UDF(用户定义的函数)是不可避免的。但必须注意,该函数无法返回python datetime。所以现在必须要分两个步骤进行。

  1. UDF用于解析日期字符串,转换格式并返回与to_timestamp()兼容的字符串
  2. 使用to_timestamp()转换spark数据帧中的数据类型
from datetime import datetime
import pytz
from pyspark.sql.functions import udf, to_date, to_utc_timestamp

## Converting date string format
def getDate(x):
    if x is not None:
        return str(datetime.strptime(x,'%a %b %d %H:%M:%S +0000 %Y').replace(tzinfo=pytz.UTC).strftime("%Y-%m-%d %H:%M:%S"))
    else:
        return None

## UDF declaration
date_fn = udf(getDate, StringType())

## Converting datatype in spark dataframe
df = df.withColumn("created_at", to_utc_timestamp(date_fn("created_at"),"UTC")) 

答案 1 :(得分:0)

使用SimpleDateFormat构建时间戳格式: 尝试使用以下对我有用的解决方案。

date_df = df.select('created_at', from_unixtime(
    unix_timestamp(col("created_at"),
                        "EEE MMM dd HH:mm:ss ZZZZ yyyy")).alias('date'))

答案 2 :(得分:0)

为响应pardeep的回答,对我进行了一些改动就可以解决问题。

unix_timestamp("created_at", "EEE MMM dd HH:mm:ss Z yyyy")

答案 3 :(得分:0)

data_df=spark.createDataFrame([(1,'Mon Oct 05 23:18:25 -0700 2020'),(2,'Tue Oct 06 23:18:25 -0700 2020')], ['srno','created_at'])

data_df.show(2,False)

enter image description here

data_df.printSchema()

enter image description here

date_df = data_df.select('created_at', from_unixtime(unix_timestamp('created_at', 'EEE MMM d HH:mm:ss z yyyy')).alias('date'))

date_df.show(2,False)

enter image description here

我们也可以使用to_timestamp函数代替unix_timestamp 和from_unixtime。

data_df.select('created_at', to_timestamp('created_at', 'EEE MMM d HH:mm:ss z yyyy').alias('date')).show(2,False)

data_df.select('created_at', from_unixtime(unix_timestamp('created_at', 'EEE MMM d HH:mm:ss z yyyy')).alias('date')).show(2,False)

enter image description here