Spark Dataframe UDF - 不支持 Any 类型的架构
Spark Dataframe UDF - Schema for type Any is not supported
我正在编写 Spark Scala UDF 并面向 "java.lang.UnsupportedOperationException: Schema for type Any is not supported"
import org.apache.spark.sql.expressions.UserDefinedFunction
import org.apache.spark.sql.functions.udf
val aBP = udf((bG: String, pS: String, bP: String, iOne: String, iTwo: String) => {
if (bG != "I") {"NA"}
else if (pS == "D")
{if (iTwo != null) iOne else "NA"}
else if (pS == "U")
{if (bP != null) bP else "NA"}
})
这是抛出错误 "java.lang.UnsupportedOperationException: Schema for type Any is not supported"
正如 中所讨论的那样,您的 udf 应该 return:
- 基元(整数、字符串、布尔值...)
- 其他支持类型的元组
- 其他支持类型的列表、数组、映射
- 其他受支持类型的案例 类
因此,如果您在代码中添加另一个 else,编译将成功。
val aBP = udf((bG: String, pS: String, bP: String, iOne: String, iTwo: String) => {
if (bG != "I") {"NA"}
else if (pS == "D") {
if (iTwo != null)
iOne
else "NA"
} else if (pS == "U") {
if (bP != null)
bP
else
"NA"
} else {
""
}
})
您还可以使用模式匹配重新分发您的代码:
val aBP = udf [String, String, String, String, String, String] {
case (bG: String, _, _, _, _) if bG != "I" => "NA"
case (_, pS: String, _, iOne: String, iTwo: String) if pS == "D" && iTwo.isEmpty => iOne
case (_, pS: String, _, _, _) if pS == "D" => "NA"
case (_, pS: String, bP: String, _, _) if pS == "U" && bP.isEmpty => bP
case (_, pS: String, _, _, _) if pS == "U" => "NA"
case _ => ""
}
我正在编写 Spark Scala UDF 并面向 "java.lang.UnsupportedOperationException: Schema for type Any is not supported"
import org.apache.spark.sql.expressions.UserDefinedFunction
import org.apache.spark.sql.functions.udf
val aBP = udf((bG: String, pS: String, bP: String, iOne: String, iTwo: String) => {
if (bG != "I") {"NA"}
else if (pS == "D")
{if (iTwo != null) iOne else "NA"}
else if (pS == "U")
{if (bP != null) bP else "NA"}
})
这是抛出错误 "java.lang.UnsupportedOperationException: Schema for type Any is not supported"
正如
- 基元(整数、字符串、布尔值...)
- 其他支持类型的元组
- 其他支持类型的列表、数组、映射
- 其他受支持类型的案例 类
因此,如果您在代码中添加另一个 else,编译将成功。
val aBP = udf((bG: String, pS: String, bP: String, iOne: String, iTwo: String) => {
if (bG != "I") {"NA"}
else if (pS == "D") {
if (iTwo != null)
iOne
else "NA"
} else if (pS == "U") {
if (bP != null)
bP
else
"NA"
} else {
""
}
})
您还可以使用模式匹配重新分发您的代码:
val aBP = udf [String, String, String, String, String, String] {
case (bG: String, _, _, _, _) if bG != "I" => "NA"
case (_, pS: String, _, iOne: String, iTwo: String) if pS == "D" && iTwo.isEmpty => iOne
case (_, pS: String, _, _, _) if pS == "D" => "NA"
case (_, pS: String, bP: String, _, _) if pS == "U" && bP.isEmpty => bP
case (_, pS: String, _, _, _) if pS == "U" => "NA"
case _ => ""
}