我遇到了两次调用UDF的问题。我尝试运行的第一个SQL命令是:
sqlContext.sql("SELECT * FROM ( SELECT city, CTOF(avgLow) AS Feren FROM citytemps ) AS x WHERE Feren > 30.0 ORDER BY Feren DESC").show();
其中CTOF是我的UDF。
我注意到CTOF在这里被调用了两次(我怀疑在WHERE子句中然后再在SELECT子句中)。我在我的CTOF函数中添加了print语句,看到任何高于30度的ferenheit计算,CTOF被调用两次。我宁愿只调用一次,因为我可以有一个非常大的数据帧。
在我没有运气的SQL命令后,我尝试了以下内容:
val ferenDF = sqlContext.sql("SELECT city, CTOF(avgLow) AS Feren FROM citytemps");
ferenDF.registerTempTable("ferenTemp");
sqlContext.sql("SELECT city, Feren from ferenTemp WHERE Feren > 30.0 ORDER BY Feren DESC").show();
我的UDF,CTOF,仍被调用两次。无论如何我可以运行这些SQL命令,以便CTOF只被称为ONCE吗? 仅供参考,我使用Spark 2.1.0。