2015-12-15 70 views
2

我试图在Cassandra中使用它的Int表示来存储一个scala枚举,但我总是得到一个com.datastax.spark.connector.types.TypeConversionException。我想知道枚举类是一个特例还是我做错了什么。使用Spark Cassandra连接器将枚举存储为Cassandra

编辑(2015-12-16)。 让我试着用一段代码扩展我的问题,这样我可以更好地传达这个想法。

import org.apache.spark.{SparkConf, SparkContext} 

import com.datastax.spark.connector._ 

object WeekDay { 
    sealed abstract class WeekDay(val id: Int) 

    case object MON extends WeekDay(0) 
    case object TUE extends WeekDay(1) 
    case object WED extends WeekDay(2) 
    case object THU extends WeekDay(3) 
    case object FRI extends WeekDay(4) 
    case object SAT extends WeekDay(5) 
    case object SUN extends WeekDay(6) 

    val values = Map(0 -> MON, 1 -> TUE, 2 -> WED, 3 -> THU, 4 -> FRI, 5 -> SAT, 6 -> SUN) 
} 
import WeekDay._ 

object Example { 

    case class MyCassandraRow(id: String, weight: Int, day: WeekDay) 

    def main (args: Array[String]) { 
    val conf = new SparkConf() 
     .setAppName("cassandra-connector-example") 
     .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer") 
     .set("spark.cassandra.connection.host", "127.0.0.1") 
     .setMaster("local[*]") 
    val sc = new SparkContext(conf) 

    val data = sc.parallelize(
     Seq(
     MyCassandraRow("identifier1", 10, MON), 
     MyCassandraRow("identifier2", 20, FRI), 
     MyCassandraRow("identifier3", 1, SUN) 
    ) 
    ) 

    data.saveToCassandra("db", "custom_data") 
    } 
} 

此代码的工作正常的,如果我创建使用的“天”字段中的文本我custom_data表,但如果我用下面的堆栈跟踪设置为INT失败:

com.datastax.spark.connector.types.TypeConversionException: Cannot convert object FRI of type class WeekDay$FRI$ to java.lang.Integer. 
at com.datastax.spark.connector.types.TypeConverter$$anonfun$convert$1.apply(TypeConverter.scala:42) 
at com.datastax.spark.connector.types.TypeConverter$$anonfun$convert$1.apply(TypeConverter.scala:40) 
at scala.PartialFunction$AndThen.applyOrElse(PartialFunction.scala:185) 

所以,我曾尝试截至https://github.com/datastax/spark-cassandra-connector/blob/master/doc/6_advanced_mapper.md 如下描述来实现的TypeConverter:

implicit object IntToWeekDayConverter extends TypeConverter[WeekDay] { 
    def targetTypeTag = typeTag[WeekDay] 
    def convertPF = { 
    case i: Int => values.getOrElse(i, MON) 
    } 
} 

implicit object WeekDayToIntConverter extends TypeConverter[Int] { 
    def targetTypeTag = typeTag[Int] 
    def convertPF = { 
    case d: WeekDay => d.id 
    } 
} 

但我仍然得到同样的错误。

我已经发表在这里,整个斯卡拉文件:https://gist.github.com/davideanastasia/b0bef569b4b7dec66c3f#file-cassandraenum-scala

回答

1

有来自枚举没有自动转换器 - >整数星火卡桑德拉连接器。我只想用.id将该列映射到整数表示形式。

object WeekDay extends Enumeration { 
    type WeekDay = Value 
    val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value 
} 
import WeekDay._ 
val meetingDays = Seq(WeekDay.Mon, WeekDay.Wed) 
//meetingDays: Seq[WeekDay.Value] = List(Mon, Wed) 
meetingDays.map(_.id) 
//Seq[Int] = List(0, 2) 
+0

然后,我将需要一个临时类来从卡桑德拉转换进入我的案例类。我想我可以利用Spark Cassandra连接器中的TypeConverter来为我做繁重的工作。无论如何,感谢您的回答,我已经提出了我的问题,因此可能情况会更加清晰。 – davideanastasia

+1

你有没有尝试转换为java.lang.Integer而不是一个斯卡拉 – RussS

+0

是的,这有效!之后我不得不改变一些小事情,但那使它成功了。如果你花时间写一个完整的答案,我会upvote它。 – davideanastasia

相关问题