2017-03-21 8 views
0

私は約275カラムを持っており、正規表現文字列"^D(410|412)のために25カラムを検索したいと思います。この検索文字列が2 5列のいずれかにある場合は、trueMyNewColumnを追加したいと思います。pyspark udfの可変引数数

以下を使用して、私は2の列でそれを行うことができます。列の可変数を渡すためのとにかくありますか?コードの下

は、私はサンプルコードは、これを試してみて、進んでいる同様のものをいくつかを試してみました2列

def moreThanTwoArgs(col1,col2): 
return bool((re.search("^D(410|412)",col1) or re.search("^D(410|412)",col2))) 

twoUDF= udf(moreThanTwoArgs,BooleanType()) 
df = df.withColumn("MyNewColumn", twoUDF(df["X1"], df["X2"])) 

答えて

1

のために動作します: -

df1 = sc.parallelize(
     [ 
      [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 
      [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 
      [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 
      [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 
      [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 
      [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 
      [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 
    ]).toDF(['c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'c10']) 
df1.show() 
+---+---+---+---+---+---+---+---+---+---+ 
| c1| c2| c3| c4| c5| c6| c7| c8| c9|c10| 
+---+---+---+---+---+---+---+---+---+---+ 
| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10| 
| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10| 
| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10| 
| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10| 
| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10| 
| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10| 
| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10| 
+---+---+---+---+---+---+---+---+---+---+ 


import pyspark.sql.functions as F 
import pyspark.sql.types as T 
import re 

def booleanFindFunc(*args): 
    return sum(args) 

udfBoolean = F.udf(booleanFindFunc, T.StringType()) 


#Below is Sum of three columns (c1+c2+c2) 
df1.withColumn("MyNewColumn", booleanFindFunc(F.col("c1"), F.col("c2"), F.col("c2"))).show() 
+---+---+---+---+---+---+---+---+---+---+-----------+ 
| c1| c2| c3| c4| c5| c6| c7| c8| c9|c10|MyNewColumn| 
+---+---+---+---+---+---+---+---+---+---+-----------+ 
| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10|   5| 
| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10|   5| 
| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10|   5| 
| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10|   5| 
| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10|   5| 
| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10|   5| 
| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10|   5| 
+---+---+---+---+---+---+---+---+---+---+-----------+ 



#Below is Sum of All Columns (c1+c2+c3---+c10) 
df1.withColumn("MyNewColumn", booleanFindFunc(*[F.col(i) for i in df1.columns])).show() 

+---+---+---+---+---+---+---+---+---+---+-----------+ 
| c1| c2| c3| c4| c5| c6| c7| c8| c9|c10|MyNewColumn| 
+---+---+---+---+---+---+---+---+---+---+-----------+ 
| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10|   55| 
| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10|   55| 
| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10|   55| 
| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10|   55| 
| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10|   55| 
| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10|   55| 
| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10|   55| 
+---+---+---+---+---+---+---+---+---+---+-----------+ 

#Below is Sum of All odd Columns (c1+c3+c5--+c9) 
df1.withColumn("MyNewColumn", booleanFindFunc(*[F.col(i) for i in df1.columns if int(i[1:])%2])).show() 

+---+---+---+---+---+---+---+---+---+---+-----------+ 
| c1| c2| c3| c4| c5| c6| c7| c8| c9|c10|MyNewColumn| 
+---+---+---+---+---+---+---+---+---+---+-----------+ 
| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10|   25| 
| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10|   25| 
| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10|   25| 
| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10|   25| 
| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10|   25| 
| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10|   25| 
| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10|   25| 
+---+---+---+---+---+---+---+---+---+---+-----------+ 

・ホープこれはあなたの問題を解決します