Dataframe pyspark连接,带空字符串的条件

Dataframe pyspark连接,带空字符串的条件,dataframe,join,pyspark,Dataframe,Join,Pyspark,我有三个数据帧,如下所示 df_prod Year ID Name brand Point 2020 20903 Ken KKK 2000 2019 12890 Matt MMM 209 2017 346780 Nene NNN 2000 2020 346780 Nene NNN 6000 df_miss Name brand point Holy HHH 345 Joshi JJ

我有三个数据帧,如下所示

df_prod

Year  ID      Name   brand  Point 
2020  20903   Ken    KKK    2000
2019  12890   Matt   MMM    209
2017  346780  Nene   NNN    2000
2020  346780  Nene   NNN    6000

df_miss

Name    brand   point
Holy    HHH     345
Joshi   JJJ     900

df_sale

ID      Name  Year    brand   
126789  Holy  2010            
346780  Nene  2017    NNN     
346780  Nene  2020    NNN     
我需要根据以下条件加入df_销售。 如果“品牌”不为空,则我需要在年度和名称上加入df_销售和df_产品的内部加入。 如果“brand”为空,则我需要根据名称加入df_miss的df_销售

在pyspark中的联接期间是否可能有when条件?我可以在scala上看到一些示例,但我正在寻找pyspark实现

伪码逻辑

if brand != null
   df_sale.join(df_prod, on=['Year', 'ID'], how='inner') and df_sale['Name'] = df_prod['Name'] & df_sale['point'] = df_prod['point']
   
elif brand == null
   df_sale.join(df_miss, on=['Name'], how='nner') and
   df_sale['point'] = df_prod['point']
预期产出:

ID      Name  Year    brand   point
126789  Holy  2010            345
346780  Nene  2017    NNN     2000
346780  Nene  2020    NNN     2000

是否可以在pyspark或SQL中执行此操作。请给我一些建议。谢谢。

当你想到
如果。。。否则…
数据帧(或SQL表)中的条件,请注意这些条件需要应用于表,就像您逐行遍历它一样

这就给您留下了两个选项(请注意,
f
表示
pyspark.sql.functions
):

  • 您可以根据
    f.col(“brand”).isNull()条件将
    df\u sale
    表一分为二-
    df\u sale\u brand\u null
    df\u sale\u brand
    基于
    f.col(“brand”).isNull()条件,使用类似于
    [input\u df.filter(~fail\u test),input\u df.filter(fail\u test)]
    的内容。然后在所需的列上使用相关表(
    df_sales\u brand\u null
    with
    df_miss
    )进行联接,处理未对齐的列,最后处理两个联接的表
  • 您可以使用
    df_prod
    对数据帧
    df_miss
    进行
    union
    处理
    df_miss
    中缺少的列。然后,您在条件语句中加入联合表(分别别名为
    a
    b
    ),例如
    f.when(f.col(“brand”).isNotNull(),(f.col(“a.Year”)==f.col(“b.Year”)和(f.col(“a.ID”)==f.col(“b.ID”)。否则(f.col(“a.Name”)==f.col(“b.Name”)
    。f.when(…)的输出。否则(…)
    是一列,因此您的
    join
    语句将把它识别为
    on=
    参数的有效输入

  • 谢谢你的逻辑。我试试看。