如何用替代方法UDF Spark Scala解决重载的方法值寄存器

时间:2018-06-28 08:45:26

标签: scala apache-spark user-defined-functions

我正在尝试获取完整文件路径的最后一个标记,我的代码看起来像

val testUdf = spark.udf.register("get_filename", (fullpath: String) => {
  val lastIndex = fullpath.lastIndexOf("/")
  fullpath.substring(lastIndex, fullpath.length - 1)}, DataTypes.StringType)

我得到一个错误:

Error:(39, 29) overloaded method value register with alternatives:
  (name: String,f: org.apache.spark.sql.api.java.UDF22[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _],returnType: org.apache.spark.sql.types.DataType)Unit <and> ......

有人知道如何解决此问题吗?

谢谢

1 个答案:

答案 0 :(得分:1)

没有采用Scala闭包和register的{​​{1}}方法的变体(存在DataType的变体,是为Java互操作性设计的)。

如果使用带寄存器的闭包,函数应返回可以通过反射映射为SQL类型的对象。您的情况很满意,因此只需省略数据类型:

org.apache.spark.sql.functions.udf