如何在 Pyspark 函数中引用包含 f 字符串的列?

问题描述

我正在为 Spark DF 编写一个函数,该函数对列执行操作并给它们一个后缀,这样我就可以在两个不同的后缀上运行该函数两次,然后再加入它们。

我有时间想出在这段特定的代码中引用它们的最佳方式,并且想知道我错过了什么?

def calc_date(sdf,suffix):
    final_sdf = (
        sdf.withColumn(
            f"lowest_days{suffix}",f"sdf.list_of_days_{suffix}"[0],)
        .withColumn(
            f"earliest_date_{suffix}",f"sdf.list_of_dates_{suffix}"[0],)
        .withColumn(
            f"actual_date_{suffix}",spark_fns.expr(
                f"date_sub(earliest_date_{suffix},lowest_days{suffix})"
            ),)
    )

在这里,我试图从两个列表(list_of_dayslist_of_dates)中提取一个值并执行日期计算以创建一个新变量 (actual_date)。

我想在一个函数中执行此操作,这样我就不必根据我拥有的后缀数量执行相同的一组操作两次(或更多)?

但是 f 字符串给出错误 col should be Column

对此的任何帮助将不胜感激!

解决方法

你需要用 col() 包裹第二个参数。

from pyspark.sql.functions import *

def calc_date(sdf,suffix):
    final_sdf = (
        sdf.withColumn(
            f"lowest_days{suffix}",col(f"list_of_days_{suffix}")[0],)
        .withColumn(
            f"earliest_date_{suffix}",col(f"list_of_dates_{suffix}")[0],)
    )