PySpark向现有DataFrame添加列 - TypeError:无效参数,不是字符串或列

Posted

技术标签:

【中文标题】PySpark向现有DataFrame添加列 - TypeError:无效参数,不是字符串或列【英文标题】:PySpark adding a column to an existing DataFrame - TypeError: Invalid argument, not a string or column 【发布时间】:2020-12-14 17:31:15 【问题描述】:

我正在尝试将三个计算列添加到我的数据框中。

以下方法不起作用并引发错误:

TypeError:参数无效,不是字符串或列: 类型的 DataFrame[TicketClosedDate:timestamp]。对于列字面量,请使用“lit”、“array”、“struct”或“create_map”函数。

    TAT = df.select(datediff(col('zTicketSubmitDateUTC'), col('zTicketUpdateDateUTC')).alias('TAT'))
    
    TicketClosedDate = df.select(to_timestamp(
                    when(col('TicketStatusName')=='Closed',col('TicketUpdateDate'))
                    .when(col('TicketStatusName')=='Complete',col('TicketUpdateDate'))
                    .when(col('TicketStatusName')=='Done',col('TicketUpdateDate'))
                    .otherwise('Null')
                    ).alias('TicketClosedDate'))
    
    zTicketClosedDateUTC = df.select(to_timestamp(
                    when(col('TicketStatusName')=='Closed',col('zTicketUpdateDateUTC'))
                    .when(col('TicketStatusName')=='Complete',col('zTicketUpdateDateUTC'))
                    .when(col('TicketStatusName')=='Done',col('zTicketUpdateDateUTC'))
                    .otherwise('Null')
                    ).alias('zTicketClosedDateUTC'))
    
    
    df2 = df.select(
        col('ProjectID'),
        col('TicketID'),
        col('ChildTicketID'),
        col('TicketSubmitDate'),
        col('zTicketSubmitDateUTC'),
        col('TicketUpdateDate'),
        col('zTicketUpdateDateUTC'),
        TicketClosedDate,
        zTicketClosedDateUTC,
        col('TicketStatusName'),
        col('PtgName'),
        col('TicketCategory'),
        TAT)

【问题讨论】:

【参考方案1】:

试试下面的代码。你不需要在变量中做df.select()

TAT = datediff(col('zTicketSubmitDateUTC'), col('zTicketUpdateDateUTC')).alias('TAT')

TicketClosedDate = to_timestamp(
                when(col('TicketStatusName')=='Closed',col('TicketUpdateDate'))
                .when(col('TicketStatusName')=='Complete',col('TicketUpdateDate'))
                .when(col('TicketStatusName')=='Done',col('TicketUpdateDate'))
                .otherwise('Null')
                ).alias('TicketClosedDate')

zTicketClosedDateUTC = to_timestamp(
                when(col('TicketStatusName')=='Closed',col('zTicketUpdateDateUTC'))
                .when(col('TicketStatusName')=='Complete',col('zTicketUpdateDateUTC'))
                .when(col('TicketStatusName')=='Done',col('zTicketUpdateDateUTC'))
                .otherwise('Null')
                ).alias('zTicketClosedDateUTC')


df2 = df.select(
    col('ProjectID'),
    col('TicketID'),
    col('ChildTicketID'),
    col('TicketSubmitDate'),
    col('zTicketSubmitDateUTC'),
    col('TicketUpdateDate'),
    col('zTicketUpdateDateUTC'),
    TicketClosedDate,
    zTicketClosedDateUTC,
    col('TicketStatusName'),
    col('PtgName'),
    col('TicketCategory'),
    TAT)

【讨论】:

以上是关于PySpark向现有DataFrame添加列 - TypeError:无效参数,不是字符串或列的主要内容,如果未能解决你的问题,请参考以下文章

向 pyspark 中的数据框添加列

如何在 Spark SQL 中向现有 Dataframe 添加新列

用修改后的 PySpark DataFrame 覆盖现有 Parquet 数据集

Pyspark - 从 DataFrame 列的操作创建新列给出错误“列不可迭代”

向 pyspark Dataframe 添加新行

从另一个 DataFrame 将列添加到 Pyspark DataFrame