2015-06-20 9 views
5

Ich habe Datenrahmen Funken mit Take (5) Top-Reihen wie folgt:Spark DataFrame TimestampType - wie bekommt man Jahr, Monat, Tag Werte aus dem Feld?

[Row(date=datetime.datetime(1984, 1, 1, 0, 0), hour=1, value=638.55), 
Row(date=datetime.datetime(1984, 1, 1, 0, 0), hour=2, value=638.55), 
Row(date=datetime.datetime(1984, 1, 1, 0, 0), hour=3, value=638.55), 
Row(date=datetime.datetime(1984, 1, 1, 0, 0), hour=4, value=638.55), 
Row(date=datetime.datetime(1984, 1, 1, 0, 0), hour=5, value=638.55)] 

Es wird Schema wie folgt definiert:

elevDF.printSchema() 

root 
|-- date: timestamp (nullable = true) 
|-- hour: long (nullable = true) 
|-- value: double (nullable = true) 

Wie erhalte ich die Jahr, Monat, Tag Werte aus dem " Datum 'Feld?

Antwort

4

können Sie einfach verwenden map wie bei jedem anderen RDD:

elevDF = sqlContext.createDataFrame(sc.parallelize([ 
     Row(date=datetime.datetime(1984, 1, 1, 0, 0), hour=1, value=638.55), 
     Row(date=datetime.datetime(1984, 1, 1, 0, 0), hour=2, value=638.55), 
     Row(date=datetime.datetime(1984, 1, 1, 0, 0), hour=3, value=638.55), 
     Row(date=datetime.datetime(1984, 1, 1, 0, 0), hour=4, value=638.55), 
     Row(date=datetime.datetime(1984, 1, 1, 0, 0), hour=5, value=638.55)])) 

(elevDF 
.map(lambda (date, hour, value): (date.year, date.month, date.day)) 
.collect()) 

und das Ergebnis ist:

[(1984, 1, 1), (1984, 1, 1), (1984, 1, 1), (1984, 1, 1), (1984, 1, 1)] 

Btw: datetime.datetime speichert eine Stunde sowieso so dass es separat zu halten scheint eine Verschwendung zu sein der Erinnerung.

Seit 1.5 Funken Sie

import datetime 
from pyspark.sql.functions import year, month, dayofmonth 

elevDF = sc.parallelize([ 
    (datetime.datetime(1984, 1, 1, 0, 0), 1, 638.55), 
    (datetime.datetime(1984, 1, 1, 0, 0), 2, 638.55), 
    (datetime.datetime(1984, 1, 1, 0, 0), 3, 638.55), 
    (datetime.datetime(1984, 1, 1, 0, 0), 4, 638.55), 
    (datetime.datetime(1984, 1, 1, 0, 0), 5, 638.55) 
]).toDF(["date", "hour", "value"]) 

elevDF.select(year("date").alias('year'), month("date").alias('month'), dayofmonth("date").alias('day')).show() 
# +----+-----+---+ 
# |year|month|day| 
# +----+-----+---+ 
# |1984| 1| 1| 
# |1984| 1| 1| 
# |1984| 1| 1| 
# |1984| 1| 1| 
# |1984| 1| 1| 
# +----+-----+---+ 
+0

Ok danke dafür, es hat vorher nicht für mich funktioniert, aber es funktioniert nicht w mit 'elevDF.map (Lambda (Datum, Wert): (Datum.Jahr, Wert))' ' – curtisp

5

Sie Funktionen in pyspark.sql.functions können Sie eine Anzahl von Datumsverarbeitungsfunktionen verwenden können: Funktionen wie year, month, etc

siehe hier: https://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.DataFrame

from pyspark.sql.functions import * 

newdf = elevDF.select(year(elevDF.date).alias('dt_year'), month(elevDF.date).alias('dt_month'), dayofmonth(elevDF.date).alias('dt_day'), dayofyear(elevDF.date).alias('dt_dayofy'), hour(elevDF.date).alias('dt_hour'), minute(elevDF.date).alias('dt_min'), weekofyear(elevDF.date).alias('dt_week_no'), unix_timestamp(elevDF.date).alias('dt_int')) 

newdf.show() 


+-------+--------+------+---------+-------+------+----------+----------+ 
|dt_year|dt_month|dt_day|dt_dayofy|dt_hour|dt_min|dt_week_no| dt_int| 
+-------+--------+------+---------+-------+------+----------+----------+ 
| 2015|  9|  6|  249|  0|  0|  36|1441497601| 
| 2015|  9|  6|  249|  0|  0|  36|1441497601| 
| 2015|  9|  6|  249|  0|  0|  36|1441497603| 
| 2015|  9|  6|  249|  0|  1|  36|1441497694| 
| 2015|  9|  6|  249|  0| 20|  36|1441498808| 
| 2015|  9|  6|  249|  0| 20|  36|1441498811| 
| 2015|  9|  6|  249|  0| 20|  36|1441498815|