2016-05-20 11 views
5

Tôi đã một dataframe gọi train, ông có giản đồ sau:chuỗi Chuyển đổi để đánh dấu thời gian cho Spark sử dụng scala

root 
|-- date_time: string (nullable = true) 
|-- site_name: integer (nullable = true) 
|-- posa_continent: integer (nullable = true) 

Tôi muốn đúc cột date_time-timestamp và tạo một cột mới với giá trị year chiết xuất từ cột date_time.

Để được rõ ràng, tôi có dataframe sau:

+-------------------+---------+--------------+ 
|   date_time|site_name|posa_continent| 
+-------------------+---------+--------------+ 
|2014-08-11 07:46:59|  2|    3| 
|2014-08-11 08:22:12|  2|    3| 
|2015-08-11 08:24:33|  2|    3| 
|2016-08-09 18:05:16|  2|    3| 
|2011-08-09 18:08:18|  2|    3| 
|2009-08-09 18:13:12|  2|    3| 
|2014-07-16 09:42:23|  2|    3| 
+-------------------+---------+--------------+ 

Tôi muốn nhận được dataframe sau:

+-------------------+---------+--------------+--------+ 
|   date_time|site_name|posa_continent|year | 
+-------------------+---------+--------------+--------+ 
|2014-08-11 07:46:59|  2|    3|2014 | 
|2014-08-11 08:22:12|  2|    3|2014 | 
|2015-08-11 08:24:33|  2|    3|2015 | 
|2016-08-09 18:05:16|  2|    3|2016 | 
|2011-08-09 18:08:18|  2|    3|2011 | 
|2009-08-09 18:13:12|  2|    3|2009 | 
|2014-07-16 09:42:23|  2|    3|2014 | 
+-------------------+---------+--------------+--------+ 

Trả lời

10

Vâng, nếu bạn muốn cast date_timecolumn để timestampand tạo cột mới có giá trị năm sau đó thực hiện chính xác:

import org.apache.spark.sql.functions.year 

df 
    .withColumn("date_time", $"date_time".cast("timestamp")) // cast to timestamp 
    .withColumn("year", year($"date_time")) // add year column 
+0

@jackAKAkarthik Đây không phải là điều tương tự và có vẻ mã của bạn không thành công với một số công việc phát trực tiếp. – zero323

+0

Nó không chỉ sau khi thêm .withColumn vào dataframe của tôi. –

+0

Vì vậy, wat có thể là vấn đề ở đây? –

1

Bạn có thể ánh xạ khung dữ liệu để thêm năm vào cuối mỗi hàng:

df.map { 
    case Row(col1: String, col2: Int, col3: Int) => (col1, col2, col3, DateTime.parse(col1, DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")).getYear) 
}.toDF("date_time", "site_name", "posa_continent", "year").show() 
Các vấn đề liên quan