我的数据在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操作。
答案 0 :(得分:0)
我无法提供所提供的任何解决方案。显然pyspark.sql上的to_timestamp()
函数以某种格式读取输入。提供格式的所有尝试均未产生任何结果。因此,使用UDF(用户定义的函数)是不可避免的。但必须注意,该函数无法返回python datetime。所以现在必须要分两个步骤进行。
to_timestamp()
兼容的字符串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)
data_df.printSchema()
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)
我们也可以使用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)