2015-06-20 16 views
5

Tôi có Spark DataFrame với mất (5) hàng đầu như sau:Dấu thời gian của khung dữ liệu Spark - cách lấy giá trị Năm, Tháng, Ngày từ trường?

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

Nó giản đồ được định nghĩa là:

elevDF.printSchema() 

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

Làm thế nào để có được các giá trị Năm, Tháng, Ngày từ ' ngày 'trường?

Trả lời

4

Bạn có thể sử dụng đơn giản map như với bất kỳ RDD khác:

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

và kết quả là:

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

Btw: datetime.datetime cửa hàng một giờ anyway vì vậy giữ nó dường như tách biệt là một sự lãng phí bộ nhớ.

Từ Spark 1.5, bạn có thể sử dụng một số chức năng xử lý ngày

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 cảm ơn vì điều đó, nó không hoạt động với tôi trước đây, nhưng có nó hoạt động không w với 'elevDF.map (lambda (ngày, giá trị): (date.year, value))' – curtisp

5

Bạn có thể sử dụng chức năng trong pyspark.sql.functions: các chức năng như year, month, etc

tham khảo ở đây: 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| 
Các vấn đề liên quan