我正在尝试基于String定义UserDefinedType,但与Spark 2.4.1中的StringType不同,但是似乎Spark中存在错误或我做错了什么。
我的定义如下:
temp_output_wavelets = copy.deepcopy(output_wavelets)
我希望仅使用自定义SQL类型将其读取并存储为String。实际上,Spark根本无法读取字符串:
class MyType extends UserDefinedType[MyValue] {
override def sqlType: DataType = StringType
...
}
@SQLUserDefinedType(udt = classOf[MyType])
case class MyValue
我认为问题在于UnivocityParser.makeConverter在UDT情况下不返回(String =>任何)函数而是(String =>(String =>任何))
答案 0 :(得分:1)
看起来确实是Spark中的错误。我查看了Spark 2.4.1的源代码,发现以下内容:
case udt: UserDefinedType[_] => (datum: String) =>
makeConverter(name, udt.sqlType, nullable, options)
将此更改为
case udt: UserDefinedType[_] =>
makeConverter(name, udt.sqlType, nullable, options)
解决了我的问题。为Spark提出了一个问题:https://issues.apache.org/jira/browse/SPARK-27591