我的Spark DataDrame
中有一个包含多种字符串格式的Date列。我想把这些扔给Date Time。
我的专栏中有两种格式:
mm/dd/yyyy
;及yyyy-mm-dd
到目前为止,我的解决方案是使用UDF更改第一个日期格式以匹配第二个日期格式,如下所示:
import re
def parseDate(dateString):
if re.match('d{1,2}/d{1,2}/d{4}', dateString) is not None:
return datetime.strptime(dateString, '%M/%d/%Y').strftime('%Y-%M-%d')
else:
return dateString
# Create Spark UDF based on above function
dateUdf = udf(parseDate)
df = (df.select(to_date(dateUdf(raw_transactions_df['trans_dt']))))
这是可行的,但并不完全具有容错性。我特别关注的是:
- 我还没有遇到过日期格式。
- 区分
mm/dd/yyyy
和dd/mm/yyyy
(我使用的regex目前显然不能做到这一点)。
有没有更好的方法来做这件事?
3条答案
按热度按时间yqhsw0fo1#
就我个人而言,我建议直接使用SQL函数,而不必进行昂贵且低效的重新格式化:
这将选择第一种格式,它可以成功地解析输入字符串。
用途:
它将比
udf
更快,添加新格式只需调整formats
参数即可。然而,它不会帮助您解决格式不明确的问题。在一般情况下,如果没有人工干预和与外部数据的相互参照,可能不可能做到这一点。
当然,同样的事情也可以在Scala中完成:
yrefmtwq2#
您可以用100%的SQL实现这一点,如下所示:
hof1towb3#
使用TO_TIMESTAMP(),我认为问题来自时间格式规则,例如您的数据如下:
请注意“dd/MM/yyyy HH:mm:ss”、“dd:mm:yyyy HH:mm:ss”的区别,请参见下面的比较: