使用sparklyr拆分Spark DataFrame日期时间列遇格式异常问题
解决Spark DataFrame拆分日期时间列的问题
你用正则处理日期时间拆分时踩了个小坑,咱们先理清问题根源,再给你更靠谱的解决方案:
为什么你的正则方法出错?
你写的正则^[^_]* 里,[^_]是匹配非下划线的字符,但你的日期时间格式是用空格分隔日期和时间(比如2018-06-11 22:06:45),根本没有下划线。这就导致这个正则会匹配从开头到字符串末尾的所有内容(因为找不到下划线),替换后结果自然不对。就算你改成^[^ ]* (匹配到第一个空格),如果你的date_and_time列是timestamp类型而非字符串,Spark在处理正则时会把它转成带时区的默认字符串格式(比如2018-06-11T22:06:45+08:00),这时候正则还是会失效。
更稳妥的解决方案:用Spark内置日期函数
Spark提供了专门处理日期时间的函数,sparklyr可以直接通过dplyr调用这些函数,既可靠又高效:
步骤1:确保列是timestamp类型(如果不是的话)
如果你的date_and_time列是字符串格式,先转换成timestamp类型,方便后续处理:
library(sparklyr) library(dplyr) spark_df <- spark_df %>% mutate(date_and_time = to_timestamp(date_and_time, "yyyy-MM-dd HH:mm:ss"))
步骤2:拆分日期和时间列
直接用date()提取日期部分,用date_format()格式化时间部分:
spark_df <- spark_df %>% mutate( date_col = date(date_and_time), # 自动生成yyyy-MM-dd格式的日期列 time_col = date_format(date_and_time, "HH:mm:ss") # 生成hh:mm:ss格式的时间列 )
如果一定要用正则(不推荐)
如果你坚持想用正则,先确保date_and_time是字符串类型,然后修正正则表达式:
spark_df <- spark_df %>% mutate(time_col = regexp_replace(date_and_time, "^\\d{4}-\\d{2}-\\d{2} ", ""))
这个正则明确匹配yyyy-MM-dd 格式的前缀,替换后就能得到正确的时间部分。不过还是推荐用内置函数,尤其是处理大数据量时,函数的性能和稳定性都比正则好。
内容的提问来源于stack exchange,提问作者Joaquim
相关产品推荐
相关产品推荐

