在Spark数据框中添加月份到日期列

时间:2017-08-10 11:16:03

标签: python apache-spark pyspark apache-spark-sql

我有一个场景,我想在spark DataFrame的日期列中添加月份,该列有两列数据类型(Date,Int)

e.g。

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

我试过下面的代码,但它似乎没有起作用 -

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

它给了我错误 -

'Column' object is not callable

如果有任何方法可以在数据帧之上不使用SQL查询,请帮助我。

3 个答案:

答案 0 :(得分: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|
+----------+-------------+-------------+

答案 1 :(得分:-2)

因为函数add_months期望第二个参数为整数,并且您传递的是列值,所以会出现错误。

尝试使用以下声明并检查

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

希望它有所帮助。

此致

Neeraj

答案 2 :(得分:-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