如何从csv读取Spark SQL UserDefinedType

时间:2019-04-29 09:06:25

标签: scala apache-spark apache-spark-sql

我正在尝试基于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 =>任何))

1 个答案:

答案 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