2015-06-20 8 views
5

devo dataframe Spark con Take (5) top righe come segue:Spark DataFrame TimestampType - come ottenere i valori di Anno, Mese, Giorno dal campo?

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

E 'lo schema è definito come:

elevDF.printSchema() 

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

Come faccio ad avere i valori di anno, mese, giorno dal' data 'campo?

risposta

4

è possibile utilizzare semplici map come con qualsiasi altra 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()) 

e il risultato è:

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

Btw: datetime.datetime memorizza l'ora in ogni caso in modo da mantenere sembra separatamente ad essere uno spreco di memoria.

Dal Spark 1.5 è possibile utilizzare una serie di funzioni di elaborazione di data

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 grazie per quello, non funzionava per me prima, ma ha funzionato no w con 'elevDF.map (lambda (date, value): (date.year, value))' – curtisp

5

È possibile utilizzare le funzioni in pyspark.sql.functions: funzioni come year, month, etc

si riferiscono a qui: 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| 
Problemi correlati