apache-spark - 如何在pyspark中使用带有两列的date_add?
问题描述
我有一个包含一些列的数据框:
+------------+--------+----------+----------+
|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))
如何解决这个问题呢?
解决方案
来自 Pyspark 文档
pyspark.sql.functions.date_add(开始,天)
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
期望第一个参数是一列,第二个参数是一个整数(表示要添加到该列的天数)。
您可以在没有 UDF 的情况下执行您想要执行的操作,但使用如下 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|
+----------+---+----------+
推荐阅读
- python - 在烧瓶应用程序中使用子进程执行 python 文件,而不是在烧瓶应用程序中编写脚本
- android - 华为应用内购买:短时间内执行多个请求导致错误
- php - 为 php 7.2 激活 Sqlite3
- vb.net - 如何在具有 MS 访问权限的 vb.net 中修复我的程序的更新查询
- swift - 如何修复表格视图单元格表单上的重复数据?
- angular - 使用 Jasmine 进行角度的 Kendo-dropdown 单元测试
- c# - Docusign:IHttpContextAccessor 在没有核心的普通 C# web api 中替代
- ios - 在 App Store 上更改应用程序的语言信息
- sql - 如何在 SQLite 触发器中使用或替换“WITH RECURSIVE”来更新树结构表
- android - 将第二个应用程序连接到 Firebase 时出现问题