Как читать Spark SQL UserDefinedType из CSV - PullRequest
2 голосов
/ 29 апреля 2019

Я пытаюсь определить UserDefinedType на основе String, но отличается от StringType в Spark 2.4.1, но похоже, что в Spark есть ошибка или я что-то делаю неправильно.

Я определяю свой тип какследует:

class MyType extends UserDefinedType[MyValue] {
  override def sqlType: DataType = StringType
  ...
}

@SQLUserDefinedType(udt = classOf[MyType])
case class MyValue

Я ожидаю, что он будет прочитан и сохранен в виде строки только с пользовательским типом SQL.На самом деле Spark вообще не может прочитать строку:

java.lang.ClassCastException: org.apache.spark.sql.execution.datasources.csv.UnivocityParser$$anonfun$makeConverter$11 cannot be cast to org.apache.spark.unsafe.types.UTF8String
    at org.apache.spark.sql.catalyst.expressions.BaseGenericInternalRow$class.getUTF8String(rows.scala:46)
    at org.apache.spark.sql.catalyst.expressions.GenericInternalRow.getUTF8String(rows.scala:195)
    at org.apache.spark.sql.catalyst.expressions.JoinedRow.getUTF8String(JoinedRow.scala:102)

Я думаю, что проблема в UnivocityParser.makeConverter, который не возвращает функцию (String => Any), но (String => (String =)> Любой)) в случае UDT

1 Ответ

1 голос
/ 29 апреля 2019

Похоже, что это действительно ошибка в 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...