【问题标题】:Py4JError: An error occured while calling o129.and. Trace: py4j.Py4JException: Method and ([class java.lang.string]) does not existPy4JError:调用 o129.and 时发生错误。跟踪:py4j.Py4JException:方法和([class java.lang.string])不存在
【发布时间】:2020-05-15 09:59:20
【问题描述】:

我正在尝试检查 pyspark 数据框中的条件并将值添加到如下所示的列中:

DF:

cd    id    Location
A     A     A
A     AA    A
A     AAA   
A     B     B
A     BB    B
A     BBB   

预期输出:

cd    id    Location
A     A     A
A     AA    A
A     AAA   New_Loc
A     B     B
A     BB    B
A     BBB   New_Loc   

我尝试使用以下 pyspark 转换进行填充

df_new = df.withColumn('Location',sf.when(df.cd == 'A' & (df.id isin(['AAA','BBB'])),'New_Loc').otherwise(df.Location))

当我尝试执行此操作时,我收到错误消息: Py4JError:调用 o129.and 时发生错误。 Trace: py4j.Py4JException: Method and ([class java.lang.string]) 不存在

知道这是什么错误吗?

【问题讨论】:

    标签: dataframe pyspark py4j


    【解决方案1】:

    这很可能是语法。这应该有效:

    import pyspark.sql.functions as f
    
    df_new = df.withColumn(
      'Location', 
      f.when(
        (f.col('cd') == 'A') & (f.col('id').isin(['AAA','BBB'])),
        f.lit('New_Loc'))
      .otherwise(f.col('Location'))
    )
    

    【讨论】:

    • 在第一个条件周围添加括号有效。虽然 lit 不是必需的。感谢您的回复
    • 是的,pyspark 通常会与 == 等运算符和& 等后续逻辑运算符斗争。话虽如此,我建议使用f.lit()f.col(),因为某些pyspark 方法和函数被重载为列名和文字值,因此具体化通常更有益和明确。此外,正如 PEP8 告诉我们的,显式 > 隐式。
    【解决方案2】:

    好的.. 在有效的条件周围添加一个括号。

    以下是对我有用的。

    df_new = df.withColumn('Location',sf.when((df.cd == 'A') & (df.id isin(['AAA','BBB'])),'New_Loc').otherwise(df.Location))
    

    【讨论】:

    猜你喜欢
    • 2023-02-01
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 2019-05-25
    • 1970-01-01
    • 2015-11-11
    • 2019-08-24
    相关资源
    最近更新 更多