PySpark技术求助:通过切片从日期字符串提取年份报错
解决PySpark中提取日期字符串年份的问题
嘿,我来帮你搞定这个问题!你遇到的问题根源在于:PySpark的Column对象不支持Python原生的字符串切片语法。你写的df.Date[-4:]是Python处理普通字符串的方式,但df.Date返回的是PySpark的Column类型,得用PySpark专门的字符串函数来处理。
下面给你两种可行的解决方案,第二种更推荐:
方案1:直接对字符串进行子串提取
用PySpark的substring函数,指定从倒数第4位开始截取4个字符,就能拿到年份:
from pyspark.sql.functions import substring # 初始化数据框 df = sqlContext.createDataFrame([("12/12/1980", 1, 2)], ("Date", "Num", "#")) # 添加年份列:从Date字段的倒数第4位开始,取4个字符 df = df.withColumn("Year", substring(df.Date, -4, 4)) # 查看结果 df.show()
你也可以用expr函数写SQL风格的表达式,效果一样:
from pyspark.sql.functions import expr df = df.withColumn("Year", expr("substring(Date, -4, 4)"))
方案2:转成日期类型后提取年份(更推荐)
如果你的日期字符串格式是固定的(比如这里的MM/dd/yyyy),更规范的做法是先把字符串转成PySpark的日期类型,再用year函数提取年份。这种方法的好处是能自动处理日期格式的小变化(比如单数字的月/日,像1/5/2023),还能验证日期的合法性(无效日期会返回null,方便后续排查):
from pyspark.sql.functions import to_date, year # 初始化数据框 df = sqlContext.createDataFrame([("12/12/1980", 1, 2)], ("Date", "Num", "#")) # 将字符串转成日期类型,指定格式为MM/dd/yyyy df = df.withColumn("Date_Type", to_date(df.Date, "MM/dd/yyyy")) # 从日期类型字段提取年份 df = df.withColumn("Year", year(df.Date_Type)) # 查看结果 df.show()
运行上面的代码后,你就能成功提取到年份啦!
内容的提问来源于stack exchange,提问作者Joel Evans
相关产品推荐
相关产品推荐

