小编Mab*_*loq的帖子

有没有办法使用 pyspark.sql.functions.date_add 和 col('column_name') 作为第二个参数而不是静态整数?

在 ETL 过程中,我有一个 5 位整数格式的 SAS 日期字段,表示自 1960 年 1 月 1 日以来的天数。为了使该数据列在分析中更有用,我想将该列转换为 Redshift 中的日期数据类型字段。

目前我正在尝试在 pyspark 中执行此操作,如下所示:

  • 使用字符串文字“1960-01-01”创建了新列“sas_date”

  • 使用 pyspark.sql.function.date_add 我将“sas-date”列作为开始日期参数传递,将整数值“arrival_date”列作为第二个参数传递。

  • 当 date_add 函数运行时,我收到错误 Column not iterable,即使我认为arrival_date 列是一个系列意味着它是可迭代的。但事实并非如此,为什么呢?

  • 当我删除“arrival_date”列并将其替换为静态整数值(例如 1)时,date_add 函数将起作用。

i94 = i94.withColumn('arrival_date', col('arrival_date').cast(Int()))
i94 = i94.withColumn('sas_date', lit("1960-01-01"))
i94 = i94.withColumn('arrival_date', date_add(col('sas_date'), i94['arrival_date']))
Run Code Online (Sandbox Code Playgroud)

我希望能够传递我的列,以便第二个 date_add 参数是动态的。然而 date_add 似乎不接受这个?如果 date_addd 不能完成此任务,除了使用 UDF 之外我还有什么其他选择?

更新: date_add() 操作之前的数据状态

i94.printSchema()
Run Code Online (Sandbox Code Playgroud)

|-- cic_id:双精度(可空 = true)

|-- Visa_id:字符串(可空 = true)

|-- port_id: 字符串 (nullable = true)

|--airline_id: 字符串 (nullable = true)

|-- cit_id:双精度(可空 …

pyspark

5
推荐指数
1
解决办法
5400
查看次数

标签 统计

pyspark ×1