我有一个我在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;'
答案 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环境。