我有一个带有两个元素(id,date)的RDD。具有以下结构:
data=sc.textFile("/user/cloudera/dates.txt")
1,01-01-2001
2,01-02-2001
3,01-03-2001
我想将我的RDD转换为:
1,01/2001
2,02/2001
3,03/2001
我怎样才能做到这一点?我尝试使用地图:
data.map(lambda l: (year(l[1]) + month(l[1])))
但是年份和月份没有定义
尝试解析字符串日期,然后使用withColumn并在每行上应用并获取解析后的新日期列。您应该将您的函数定义为udf之前使用它。
import datetime
def date_time_to_date(input_date_time):
new_date = datetime.datetime.strptime(input_date_time, "%d-%M-%Y").date()
return str(new_date.month) + "/"+ str(new_date.year)
udf_date_time_to_date = udf(date_time_to_date, StringType())
data.toDF(['id' , 'date']).withColumn('new_date', udf_date_time_to_date('date'))
您应该将文件读作csv而不是文本。我只是在Scala中使用硬编码的df来模仿它。您应该能够使用类似的语法将其转换为python。
val df = Seq((1,"01-01-2001"),(2,"01-02-2001"),(3,"01-03-2001")).toDF("a","b")
val df2 = df.withColumn("b",to_date('b,"dd-MM-yyy"))
df2.printSchema()
df2.show(false)
df2.select(col("a"), date_format('b,"MM/yyyy").as("dt1")).show(false)
结果:
root
|-- a: integer (nullable = false)
|-- b: date (nullable = true)
a | b |
---|---|
1 | 2001-01-01 |
2 | 2001-02-01 |
3 | 2001-03-01 |
a | dt1 |
---|---|
1 | 01/2001 |
2 | 02/2001 |
3 | 03/2001 |
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。