Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何将嵌套的case类转换为UDTValue类型_Scala_Cassandra_Spark Cassandra Connector - Fatal编程技术网

Scala 如何将嵌套的case类转换为UDTValue类型

Scala 如何将嵌套的case类转换为UDTValue类型,scala,cassandra,spark-cassandra-connector,Scala,Cassandra,Spark Cassandra Connector,我正在努力使用定制案例类来使用Spark(1.4.0)编写Cassandra(2.1.6)。到目前为止,我已经通过使用DataStaxspark cassandra连接器1.4.0-M1和以下案例类进行了尝试: case class Event(event_id: String, event_name: String, event_url: String, time: Option[Long]) [...] case class RsvpResponse(event: Event, group:

我正在努力使用定制案例类来使用Spark(1.4.0)编写Cassandra(2.1.6)。到目前为止,我已经通过使用DataStax
spark cassandra连接器1.4.0-M1
和以下案例类进行了尝试:

case class Event(event_id: String, event_name: String, event_url: String, time: Option[Long])
[...]
case class RsvpResponse(event: Event, group: Group, guests: Long, member: Member, mtime: Long, response: String, rsvp_id: Long, venue: Option[Venue])
为了实现这一点,我还实现了以下转换器:

implicit object EventToUDTValueConverter extends TypeConverter[UDTValue] {
  def targetTypeTag = typeTag[UDTValue]
  def convertPF = {
    case e: Event => UDTValue.fromMap(toMap(e)) // toMap just transforms the case class into a Map[String, Any]
  }
}

TypeConverter.registerConverter(EventToUDTValueConverter)
如果我手动查找转换器,我可以使用它将
Event
的实例转换为
UDTValue
,但是,当使用
sc.saveToCassandra
RsvpResponse
的实例与相关对象传递给它时,我得到以下错误:

15/06/23 23:56:29 ERROR Executor: Exception in task 1.0 in stage 0.0 (TID 1)
com.datastax.spark.connector.types.TypeConversionException: Cannot convert object Event(EVENT9136830076436652815,First event,http://www.meetup.com/first-event,Some(1435100185774)) of type class model.Event to com.datastax.spark.connector.UDTValue.
    at com.datastax.spark.connector.types.TypeConverter$$anonfun$convert$1.apply(TypeConverter.scala:42)
    at com.datastax.spark.connector.types.UserDefinedType$$anon$1$$anonfun$convertPF$1.applyOrElse(UserDefinedType.scala:33)
    at com.datastax.spark.connector.types.TypeConverter$class.convert(TypeConverter.scala:40)
    at com.datastax.spark.connector.types.UserDefinedType$$anon$1.convert(UserDefinedType.scala:31)
    at com.datastax.spark.connector.writer.DefaultRowWriter$$anonfun$readColumnValues$2.apply(DefaultRowWriter.scala:46)
    at com.datastax.spark.connector.writer.DefaultRowWriter$$anonfun$readColumnValues$2.apply(DefaultRowWriter.scala:43)

由于连接器库在内部处理
UDTValue
的方式,我的转换器似乎从未被调用过。但是,上述解决方案确实适用于从Cassandra表(包括用户定义的类型)读取数据。基于,我还将嵌套的case类直接替换为
com.datastax.spark.connector.UDTValue
类型,然后修复了所描述的问题,但中断了对数据的读取。我无法想象我要为读写数据定义两个独立的模型。还是我在这里遗漏了一些明显的东西?

自1.3版以来,不需要使用自定义类型转换器来加载和保存嵌套的UDT。只要使用case类对所有内容进行建模,并遵守字段命名约定,就可以了

我现在用1.4.0平方米试过了,效果很好。查看GitHub上的发行说明,似乎这可能已作为(1.3.0-M2)的一部分修复,并被拉入1.4.0-M2。