2017-03-01 35 views
10

'da birden çok sütun geçirme Veri çerçevesindeki ilk olanlar dışındaki tüm sütunları alacak ve toplamı (veya başka bir işlem) gerçekleştirecek bir Kullanıcı Tanımlı İşlev yazıyorum. Şimdi veri çerçevesi bazen 3 sütun veya 4 sütun veya daha fazla olabilir. Değişecektir.Pyspark: UDF

UDF'de kod olarak 4 sütun adını kodlayabildiğimi biliyorum ancak bu durumda nasıl değişeceğini öğrenmek istiyorum.

İlk iki örnekte, eklenecek iki sütun var ve ikincisinde eklemek için üç sütun var. Eğer UDF aktarmak istediğiniz tüm sütunlar aynı veri varsa

enter image description here

cevap

13

örneğin, giriş parametresi olarak diziyi kullanabilirsiniz yazın:

>>> from pyspark.sql.types import IntegerType 
>>> from pyspark.sql.functions import udf, array 
>>> sum_cols = udf(lambda arr: sum(arr), IntegerType()) 
>>> spark.createDataFrame([(101, 1, 16)], ['ID', 'A', 'B']) \ 
...  .withColumn('Result', sum_cols(array('A', 'B'))).show() 
+---+---+---+------+ 
| ID| A| B|Result| 
+---+---+---+------+ 
|101| 1| 16| 17| 
+---+---+---+------+ 

>>> spark.createDataFrame([(101, 1, 16, 8)], ['ID', 'A', 'B', 'C'])\ 
...  .withColumn('Result', sum_cols(array('A', 'B', 'C'))).show() 
+---+---+---+---+------+ 
| ID| A| B| C|Result| 
+---+---+---+---+------+ 
|101| 1| 16| 8| 25| 
+---+---+---+---+------+ 
+0

Ayrıca Scala'da çalışır: 'myUdf (dizi ($" col1 ", $" col2 "))' –

+1

Farklı türdeki sütunlar için nasıl uygulanabilir? – constructor

+0

@constructor 'dizisini' kullanabilirsiniz, eğer farklı sayıların toplam sayıları varsa (yani, tamsayı ve çift -> ikisi de ikiye bölünür) – Mariusz

4

Kullanım yapı yerine dizinin

from pyspark.sql.types import IntegerType 
from pyspark.sql.functions import udf, struct 
sum_cols = udf(lambda x: x[0]+x[1], IntegerType()) 
a=spark.createDataFrame([(101, 1, 16)], ['ID', 'A', 'B']) 
a.show() 
a.withColumn('Result', sum_cols(struct('A', 'B'))).show()