簡體   English   中英

pyspark 加入空字符串的條件

[英]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 ):

  1. 根據f.col("brand").isNull()條件,您使用[input_df.filter(~fail_test), input_df.filter(fail_test)]類的條件將df_sale表分成兩部分 - df_sale_brand_nulldf_sale_brand 然后在所需的列上加入相關表( df_sales_brand_nulldf_miss ),處理未對齊的列,最后將兩個連接的表unionByName
  2. union的dataframes df_missdf_prod ,處理在失蹤列df_miss 然后在條件語句df_sale與聯合表(分別別名為ab )連接起來,例如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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM