我在Azure上的Jupyter中使用PySpark。我正在尝试在数据帧上使用UDF进行测试,但是UDF没有执行。

我的数据框是通过以下方式创建的:

users = sqlContext.sql("SELECT DISTINCT userid FROM FoodDiaryData")


我已经确认此数据框填充了100行。在下一个单元格中,我尝试执行一个简单的udf。

def iterateMeals(user):
    print user

users.foreach(iterateMeals)


这不会产生任何输出。我希望已经打印出数据框中的每个条目。但是,如果我只是尝试iterateMeals('test'),它将启动并打印'test'。我也尝试使用pyspark.sql.functions

from pyspark.sql.functions import udf

def iterateMeals(user):
    print user
f_iterateMeals = udf(iterateMeals,LongType())

users.foreach(f_iterateMeals)


尝试此操作时,出现以下错误:

Py4JError: An error occurred while calling o461.__getnewargs__. Trace:
py4j.Py4JException: Method __getnewargs__([]) does not exist


有人可以解释我哪里出了问题吗?我将需要为此应用程序在数据框的.foreach中执行udfs。

最佳答案

您将看不到输出,因为print在工作节点上执行并转到相应的输出。有关完整说明,请参见Why does foreach not bring anything to the driver program?
foreachRDD而非DataFrame上运行。 UDFs在这种情况下无效。

关于python - PySpark:UDF不在数据帧上执行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36193789/

10-12 22:09
查看更多