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
withdf_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=
参数的有效输入谢谢你的逻辑。我试试看。