2017-08-10 65 views
1

我遇到的情況,我想幾個月添加到火花DataFrame其中有數據類型兩列的日期列(日期,智力)添加月至今列星火數據幀

例如

df.show() 
data_date months_to_add 
2015-06-23 5 
2016-07-20 7 

我想添加一個新列,這將有一個新的日期和輸出將類似於如下─

data_date month_to_add new_data_date 
2015-06-23 5   2015-11-23 
2016-07-20 1   2016-8-20 

我曾嘗試下面的代碼(添加個月至現有的日期之後),但它並不似乎是working-

df = df.withColumn("new_data_date", a 
    dd_months(col("data_date"), col("months_to_add"))) 

它給了我錯誤 -

'Column' object is not callable 

請幫助我,如果有任何方法來實現這一點,而不使用SQL查詢在數據框之上。

+0

什麼是'add_months'? – jeanr

+0

@jeanr:add_months是一個預定義的spark函數,用於將月份(整數值)添加到日期 – anurag

+0

任何其他方法也可以工作,但找不到與將日期添加到月份相關的任何內容。 – anurag

回答

3

我會使用expr

from pyspark.sql.functions import expr 

df = spark.createDataFrame(
    [("2015-06-23", 5), ("2016-07-20", 7)], 
    ("data_date", "months_to_add") 
).select(to_date("data_date").alias("data_date"), "months_to_add") 

df.withColumn("new_data_date", expr("add_months(data_date, months_to_add)")).show() 

+----------+-------------+-------------+ 
| data_date|months_to_add|new_data_date| 
+----------+-------------+-------------+ 
|2015-06-23|   5| 2015-11-23| 
|2016-07-20|   7| 2017-02-20| 
+----------+-------------+-------------+ 
+0

看起來很整潔,但是,需要多少個add_months?我不認爲這需要pyspark.sql.functions.add_months。 –

+0

@DeSanta這是一種蜂巢式功能。 – philantrovert

+0

@ user8371915謝謝你很多..這就像一個魅力 – anurag

-2

因爲函數add_months期望第二個參數爲整數,並且您傳遞的是列值,所以出現錯誤。

嘗試使用下面的語句,並檢查

df.withColumn("new_data_date",add_months(col("data_date"), df.first()[1])).show() 

希望它能幫助。

問候,

Neeraj

+1

它不起作用:( – anurag

-2

試試下面的代碼。它爲我工作。

from pyspark.sql import Row 
l = [("2015-06-23", 5),("2016-07-20", 7)] 
rdd1 = sc.parallelize(l) 
row_rdd = rdd1.map(lambda x: Row(x[0], x[1])) 
df = sqlContext.createDataFrame(row_rdd,['data_date', 'months_to_add']) 
df.withColumn("new_data_date",add_months(col("data_date"), df.first()[1])).show() 

問候, Neeraj