[英]pyspark join with conditions for empty string
我有三個數據框,如下所示。
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_sale。 如果“品牌”不是空的,那么我需要在 INNER join ON Year 和 Name 上加入 df_sale 和 df_prod。 如果“brand”為 NULL,那么我需要根據 Name 將 df_sale 與 df_miss 連接起來。
在 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 中進行。 請指點迷津。 謝謝。
當您考慮 DataFrame 中的IF ... ELSE ...
條件(或就此而言,SQL 表)時,請注意這些需要應用於表,就像您逐行遍歷它一樣。
這給您留下了兩個選項(請注意f
表示pyspark.sql.functions
):
f.col("brand").isNull()
條件,您使用[input_df.filter(~fail_test), input_df.filter(fail_test)]
類的條件將df_sale
表分成兩部分 - df_sale_brand_null
和df_sale_brand
。 然后在所需的列上加入相關表( df_sales_brand_null
和df_miss
),處理未對齊的列,最后將兩個連接的表unionByName
。union
的dataframes df_miss
與df_prod
,處理在失蹤列df_miss
。 然后在條件語句df_sale
與聯合表(分別別名為a
和b
)連接起來,例如f.when(f.col("brand").isNotNull(), (f.col("a.Year") == f.col("b.Year")) & (f.col("a.ID") == f.col("b.ID")).otherwise(f.col("a.Name") == f.col("b.Name"))
. f.when(...).otherwise(...)
是一列,因此您的join
語句會將其識別為有效輸入on=
參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.