2017-12-21 1 views
1

Ich habe eine UDF erstellt, aber ich muss eine Funktion innerhalb einer UDF aufrufen. Es gibt derzeit Nullen zurück. Könnte jemand bitte erklären, warum ich diesen Fehler bekomme.PySpark - Aufruf einer Funktion innerhalb einer UDF

a= spark.createDataFrame([("A", 20), ("B", 30), ("D", 80)],["Letter", "distances"]) 
def get_number(num): 
    return range(num) 
from pyspark.sql.functions import udf 
def cate(label): 
    if label == 20: 
     counting_list = get_number(4) 
     return counting_list 
    else: 
     return [0] 

udf_score=udf(cate, ArrayType(FloatType())) 
a.withColumn("category_list", udf_score(a["distances"])).show(10) 

aus:

+------+---------+--------------------+ 
|Letter|distances|  category_list| 
+------+---------+--------------------+ 
|  A|  20|[null, null, null...| 
|  B|  30|    [null]| 
|  D|  80|    [null]| 
+------+---------+--------------------+ 
+0

Sie erwähnen nicht, wenn Sie Python verwenden 2 oder Python 3? 'range()' verhält sich in Python 3 anders als in Python 2. –

+0

Ich benutze Python 2 –

Antwort

2

Der Datentyp für Ihre UDF ist nicht korrekt, da cate ein Array von ganzen Zahlen nicht schwimmt zurück.

udf_score=udf(cate, ArrayType(FloatType())) 

zu

:

udf_score=udf(cate, ArrayType(IntegerType())) 

this helps Können Sie bitte ändern!

edit: vorausgesetzt, Python 2.x in Bezug auf range da als @Shane Halloran in den Kommentaren erwähnt, range anders in Python 3.x verhält

Verwandte Themen