pyspark中未定义的函数UDF?

时间:2017-12-22 20:11:36

标签: python pyspark user-defined-functions

我有一个我在Dataframe中调用的UDF,但我得到了未定义的udf。

global ac
ac = sc.accumulator(0)

def incrementAC():
  ac.add(1)
  return str(ac.value)

df = sc.parallelize([('Java',90),('Scala',95),('Spark',92)]).toDF(["language","rank"])

df.withColumn("lang_and_rank", expr("concat(language,'blah')")).show()

+--------+----+-------------+
|language|rank|lang_and_rank|
+--------+----+-------------+
|    Java|  90|     Javablah|
|   Scala|  95|    Scalablah|
|   Spark|  92|    Sparkblah|
+--------+----+-------------+

myudf = udf(incrementAC,StringType())
df.withColumn("lang_and_rank", expr("concat(language,myudf())")).show()

.utils.AnalysisException: u'undefined function myudf;'

3 个答案:

答案 0 :(得分:2)

必须注册与expr一起使用的功能:

spark.udf.register("incrementAC", incrementAC)

转换中使用的accumualtors也不可靠。

答案 1 :(得分:2)

希望这有帮助!

from pyspark.sql.functions import udf, expr, concat, col
from pyspark.sql.types import StringType

ac = sc.accumulator(0)

def incrementAC():
  ac.add(1)
  return str(ac)

#sample data
df = sc.parallelize([('Java',90),('Scala',95),('Spark',92)]).toDF(["language","rank"])

方法1:

#solution using usual udf definition
myudf = udf(incrementAC, StringType())
df.withColumn("lang_and_rank", concat(col('language'), myudf())).show()

方法2:

#another solution if you want to use 'expr' (as rightly pointed out by @user9132725)
sqlContext.udf.register("myudf", incrementAC, StringType())
df = df.withColumn("lang_and_rank", expr("concat(language, myudf())"))
df.show()

输出是:

+--------+----+-------------+
|language|rank|lang_and_rank|
+--------+----+-------------+
|    Java|  90|        Java1|
|   Scala|  95|       Scala1|
|   Spark|  92|       Spark2|
+--------+----+-------------+

答案 2 :(得分:0)

重命名Java文件/函数后,我遇到了这个问题。我重新启动了Spark服务器并复制了JAR文件,但是尝试使用新的JAR文件运行当前正在运行的Jupyter Notebook时出现了未定义的函数UDF错误。

解决方案是重新启动Jupyter Notebook。我怀疑新的UDF注册并未刷新正在运行的Python环境。