【问题标题】:How to do update in pyspark using and operator?如何使用和运算符在 pyspark 中进行更新?
【发布时间】:2022-11-04 19:59:39
【问题描述】:

我正在尝试通过使用和运算符来更新我的数据框中的一列。 第一次查询

df1=df1.withcolumn('department',F.when(F.col('dateofjoining')<'2019-09-01','senior'). otherwise (''))

我在第一个查询之后运行的第二个查询

    Newcolumn=when((col('department')=='') & (col('dateofjoining')<'2019-12-15'),'junior'). otherwise ('')
  df1=df1.withcolumn('department', Newcolumn)

当我运行查询时,我只获得第二个查询的输出,但我需要两个查询的输出,如果不匹配条件,所有其他字段都应该为空。如果需要更多详细信息,请告诉我。

【问题讨论】:

  • 两个数据框列具有相同的名称,这意味着第二个会覆盖第一个。你在暗示这个吗?或者,你有什么错误吗?
  • 不,@samkart 如果我在第一次查询之前运行我的代码,我不会收到任何错误,它将我的部门列中的值更新为高级,而对于其余行,它是空的,但是当我运行我的第二个查询时,它只提供初级数据.我想同时运行这两个查询并从两者中获取数据
  • 日期格式为 yyyy-mm-dd 默认 spark 日期格式
  • 这是因为你的otherwise('')。它将值设置(或重置)为""。您可以链接多个时间——func.when().when().otherwise() 可以正常工作。或者,您可以在 otherwise() 中提供相同的列名
  • 您能否显示一个代码,我们如何使用我的代码来实现这一点

标签: python apache-spark pyspark azure-databricks


【解决方案1】:

这是我的 2 美分

  1. 创建一个数据框:

     from pyspark.sql import functions as F
    
    
     schema = StructType([ 
         StructField("department",StringType(),True), 
         StructField("dateofjoining",DateType(),True), 
     ])
    
     import datetime
    
     df = spark.createDataFrame(
         [
             ('deptA',datetime.date(2019, 8, 1)),
             ('deptB',datetime.date(2019, 12, 14)),
             ('deptC',datetime.date(2022, 12, 22)),
         ],
         schema=schema)
    
     df.show(truncate=False)
    
  2. 构造一个 when-otherwise 块,如下所示:

     df1=df.withColumn('department',
     F.when(F.col('dateofjoining')<'2019-09-01','senior')
     .when(F.col('dateofjoining')<'2019-12-15','junior')
     .otherwise (''))
    
     df1.show()  
    

    请查看下图以供参考:

【讨论】:

  • 嗨@Banu,这是错误的,我使用的是您使用的相同代码,但我只在我的列部门获得空值。我可以看到您在第二个查询中只使用了一个条件,但是有两个您可以再次检查问题吗
  • @dbd,您确定 dateofjoining 列的类型是日期而不是字符串。您也可以使用架构更新问题吗?如您所见,我在 SINGLE 查询中添加了 2 个条件,否则使用梯形图
【解决方案2】:

在上述第二个查询覆盖第一个查询结果.这就是没有得到正确结果的原因。

如果您想使用&amp; 运算符来执行此操作,您可以尝试以下操作。

首先,我添加了带有空字符串的部门列。

df=df.withColumn('department',F.lit(''))

然后使用您的查询,否则使用您的列。

df=df.withColumn('department',F.when(F.col('date')<'2019-09-01','senior').otherwise(df['department'])) 

在第二个查询中也使用你的列,否则。

df=df.withColumn('department',F.when((F.col('department')=='') & (F.col('date')<'2019-12-15'),'junior').otherwise(df1['department']))

结果:

此外,在这种情况下,您可以在第二次查询中使用!='senior',而不是在第一次查询后使用==''

df=df.withColumn('department',F.when((F.col('department')!='senior') & (F.col('date')<'2019-12-15'),'junior').otherwise(df1['department']))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 2022-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多