2017-08-23 59 views
1
我使用的火花2.1和使用

是pyscriptingPyspark UDF條件定義返回一列接受數列作爲輸入

問題描述:有一個場景,其中有一個需要通過多個列作爲輸入,並返回一個列如下面輸出是3列

ABC

的我的輸入數據幀SSS

小號NS NS

小號NS小號

SS NS

NS小號NS

我的輸出必須是如下

ABCD

SSSS

小號NS NS NS

S NS SS

SS NS NS

NS小號NS NS

我試圖註冊一個UDF通過這些3列[A,B,C]作爲輸入,並返回d列作爲輸出這裏A,B, C,d是列名

我發現很難得到下面的輸出用於

def return_string(x): 
     if [x.a=='s' & x.b=='S' & x.c=='s'] 
      return 'S' 
     else if[x.a=='s' & x.b=='NS' & x.c=='s'] 
      return 'S' 
     else if[x.a=='s' & x.b=='S' & x.c=='NS'] 
      return 'NS; 

func= udf(returnstring,types.StringType()) 

任何人都可以請幫我完成這個邏輯的語法。

+1

全都是三列重要?對於此示例輸出它似乎只依賴於C. –

+0

[Pyspark:在UDF中傳遞多個列]的可能重複(https://stackoverflow.com/questions/42540169/pyspark-pass-multiple-columns-in-udf) –

+0

是的,如果xa =='NS'&xb =='S'| x.c =='NS'返回'NS',但你提到的這個示例輸出是正確的,其他列可以單獨考慮 – user3292373

回答

4

我試圖用做內置withColumnwhen功能:

from pyspark.sql.functions import col, when, lit 

df.withColumn('d', when(
    ((col('A') == 'S') & (col('B') == 'S') & (col('C')=='S')) 
    | ((col('A') == 'S') & (col('B') == 'NS') & (col('C')=='S')) 
, lit('S') 
).otherwise(lit('NS')) 
).show() 

這也假設這兩個值是互相排斥的(因此otherwise

+0

感謝史蒂文爲了簡化它的工作 – user3292373

4

它應該是:

@udf 
def return_string(a, b, c): 
    if a == 's' and b == 'S' and c == 's': 
     return 'S' 
    if a == 's' and b == 'NS' and c == 's': 
     return 'S' 
    if a == 's' and b == 'S' and c == 'NS': 
     return 'NS' 

df = sc.parallelize([('s', 'S', 'NS'), ('?', '?', '?')]).toDF(['a', 'b', 'c']) 

df.withColumn('result', return_string('a', 'b', 'c')).show() 
## +---+---+---+------+ 
## | a| b| c|result| 
## +---+---+---+------+ 
## | s| S| NS| NS| 
## | ?| ?| ?| null| 
## +---+---+---+------+ 
  • 所有參數應列出(除非你通過數據struct)。
  • 您應該使用and而不是&(您可以評估邏輯表達式而不是SQL表達式)。
  • 條件應該是表達式而不是列表(非空列表總是truthy)。

個人而言,我會跳過所有ifs和使用簡單的dict

@udf 
def return_string(a, b, c): 
    mapping = { 
     ('s', 'S', 's'): 'S', 
     ('s', 'NS' 's'): 'S', 
     ('s', 'S', 'NS'): 'NS', 
    } 
    return mapping.get((a, b, c)) 

根據您的要求調整的條件。

總的來說,您應該更喜歡Steven Laan提供的the excellent answer中顯示的SQL表達式(可以使用when(..., ...).when(..., ...)鏈接多個條件)。

相關問題