Spark - Python - Получить год / месяц на RDD - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть СДР с двумя элементами (идентификатор, дата).Со следующей структурой:

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])))

Но год и месяц не определены

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Вы должны прочитать файл как CSV, а не текст.Я просто имитирую это, используя жестко закодированный df в Scala.Вы должны быть в состоянии преобразовать его в 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|
+---+-------+
0 голосов
/ 12 декабря 2018

Попробуйте проанализировать строковую дату, а затем применить к каждой строке, используя 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'))
...