2015-12-15 150 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

相關問題