我在scala中创建了一个与ORACLE DECODE函数等效的函数。我想将函数与SPARK数据帧列一起使用。我尝试过,但遇到了多个数据类型不匹配的问题。我不想为每个程序创建UDF。我想创建一些通用的东西并多次重用它。
功能:
def ODECODE(column: Any, Param: Any*) : Any = {
var index = 0
while (index < Param.length) {
var P = Param(index)
var Q = column
if (P.equals(Q))
return Param(index + 1)
else index = index + 1
}
return Param (Param.length - 1)
}
我想用它这样的东西:
假设"Emp"是一个数据帧,包含来自员工表的数据,其中包含列(名字、姓氏、级别)。
Emp.select(ODECODE("等级"、"A"、1、"B"、2、"C"、3、"失败")).show()
这就是一个例子。等级列中的数据类型可以是String或Integer。因此,我将解码函数(上图)中的数据类型取为ANY,但对于数据帧,它不执行转换。它会导致数据类型不匹配。
我想为一些不受支持的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))