如何使用Spark数据帧列上的函数或方法进行Scala转换

如何使用Spark数据帧列上的函数或方法进行Scala转换,scala,apache-spark-sql,user-defined-functions,Scala,Apache Spark Sql,User Defined Functions,我在scala中创建了一个相当于ORACLE解码函数的函数。我想使用SPARK dataframes列的函数。我已经尝试过了,但是数据类型不匹配导致了多个问题。 我不想为每个程序创建UDF。我想创建一些通用的东西并多次重用它 功能: def-ODECODE(列:Any,参数:Any*):Any={ var指数=0 while(索引

我在scala中创建了一个相当于ORACLE解码函数的函数。我想使用SPARK dataframes列的函数。我已经尝试过了,但是数据类型不匹配导致了多个问题。 我不想为每个程序创建UDF。我想创建一些通用的东西并多次重用它

功能:
def-ODECODE(列:Any,参数:Any*):Any={
var指数=0
while(索引<参数长度){
var P=参数(指数)
var Q=列
如果(P等于(Q))
返回参数(索引+1)
else索引=索引+1
}
返回参数(参数长度-1)
}
我想用它来做这样的事情: 假设“Emp”是一个数据框,包含来自具有列(名字、姓氏、年级)的employee表的数据

Emp.select(代码(“等级”、“A”、1、“B”、2、“C”、3、“不合格”)).show()

这是一个例子。“等级”列中的数据类型可以是字符串或整数。因此,我将decode函数(上面)中的数据类型视为任意数据类型,但对于数据帧,它不执行转换。它会导致数据类型不匹配


我想为一些不受支持的Oracle函数创建单独的函数/方法,并在转换中需要时重用它们。因此,任何关于这项工作的建议都是非常感谢的。

我知道这已经晚了,但我确实需要这个,并且找到了你的例子。我只做了一些修改就可以实现它。不过我不是专家,也许有更好的方法

import util.control.Breaks._;

def ODECODE[T](column: String, params: Seq[T]) : String = {

    try {

        var index = 0;

        breakable {

          while (index < params.length) {

              var P = params(index);
              var Q = column;

              if(P.equals(Q)) {

                  break;
              }

              index += 1;
          }
        }

        params(index - 1).toString;

    }catch {

        case ife: Exception => 

            ife.printStackTrace();

            "0";
    }
}



println(ODECODE("TEST", 0, "TEgST", 8, "***", 0))
import util.control.Breaks;
定义代码[T](列:字符串,参数:序号[T]):字符串={
试一试{
var指数=0;
易碎的{
while(索引<参数长度){
var P=参数(指数);
var Q=列;
如果(P等于(Q)){
打破
}
指数+=1;
}
}
参数(索引-1);
}抓住{
案例:异常=>
ife.printStackTrace();
"0";
}
}
println(ODECODE(“测试”,0,“测试”,8,***”,0))

Spark是否支持解码功能?我搜索了文档,但是找不到I@protocal-X,你能把上面的函数转换成PySpark函数吗?
import util.control.Breaks._;

def ODECODE[T](column: String, params: Seq[T]) : String = {

    try {

        var index = 0;

        breakable {

          while (index < params.length) {

              var P = params(index);
              var Q = column;

              if(P.equals(Q)) {

                  break;
              }

              index += 1;
          }
        }

        params(index - 1).toString;

    }catch {

        case ife: Exception => 

            ife.printStackTrace();

            "0";
    }
}



println(ODECODE("TEST", 0, "TEgST", 8, "***", 0))