如何在pyspark中使用带有两列的date_add?

1cklez4t  于 2023-11-16  发布在  Spark
关注(0)|答案(2)|浏览(144)

我有一个包含一些列的数据框:

+------------+--------+----------+----------+
|country_name| ID_user|birth_date|      psdt|
+------------+--------+----------+----------+
|      Россия|16460783|       486|1970-01-01|
|      Россия|16467391|      4669|1970-01-01|
|      Россия|16467889|      6861|1970-01-01|
|   Казахстан|16468013|      5360|1970-01-01|
|      Россия|16471027|      6311|1970-01-01|
|      Россия|16474162|      5567|1970-01-01|
|      Россия|16476386|      4351|1970-01-01|
|      Россия|16481067|      3831|1970-01-01|
|   Казахстан|16485965|     -2369|1970-01-01|
|    Германия|16486027|      5864|1970-01-01|
+------------+--------+----------+----------+
only showing top 10 rows

字符串
我需要添加带有“birth_date”的“psdt”。我写了以下代码,但(sf.date_add)不起作用:

resultbirthDF =(
        resultDF
        .select(sf.col("country_name"),
                sf.col("ID_user"),
                sf.col("birth_date"),
                sf.lit(past_datetr).alias("psdt")
               )
        .withColumn("birth_datetrue",sf.date_add(sf.to_date(sf.col("psdt")),sf.col("birth_date")))
    ).show(10)

'Column' object is not callable
Traceback (most recent call last):
  File "/volumes/disk1/yarn/local/usercache/livy/appcache/application_1573843665329_0786/container_e05_1573843665329_0786_01_000001/pyspark.zip/pyspark/sql/functions.py", line 1006, in date_add
    return Column(sc._jvm.functions.date_add(_to_java_column(start), days))


如何解决这一问题?

wwodge7n

wwodge7n1#

来自Pyspark文档
pyspark.sql.functions.date_add(start,days)

Returns the date that is days days after start

>>> df = spark.createDataFrame([('2015-04-08',)], ['dt'])
>>> df.select(date_add(df.dt, 1).alias('next_date')).collect()
[Row(next_date=datetime.date(2015, 4, 9))]

字符串
尝试将您的代码更改为sf.date_add(sf.to_date(sf.col("psdt")), 10),看看是否添加了10天。date_add期望第一个参数是一个列,第二个参数是一个整数(* 表示您希望添加到列中的天数 *)。

不需要自定义项,只需要使用SQL表达式就可以完成您的任务,如下所示:

df.withColumn("birth_datetrue", expr("date_add(psdt, birth_date)"))

输出示例

df.withColumn("new_dt", F.expr("date_add(dt, add)")).show()

+----------+---+----------+
|        dt|add|    new_dt|
+----------+---+----------+
|2015-04-08|  1|2015-04-09|
|2015-04-09|  2|2015-04-11|
|2015-04-10|  3|2015-04-13|
+----------+---+----------+

gdrx4gfi

gdrx4gfi2#

从Spark Python API 3.3.0开始,你可以使用date_add和列类型作为第二个参数:https://spark.apache.org/docs/3.3.0/api/python/_modules/pyspark/sql/functions.html#date_add
所以你的原始代码在问题中不会出现任何错误。

相关问题