2016-07-01 4 views
2

spark-cassandra-connectorを使用して、キャサンドラ行をパラメータ化された型にマップしようとしています。私は以下のようなものを、暗黙的に定義されたcolumnMapperを使用してマッピングを定義しようとしてきた:スパークRDDのキャサンドラ行とパラメータ化された型のマッピング

class Foo[T<:Bar:ClassTag:RowReaderFactory] { 
    implicit object Mapper extends JavaBeanColumnMapper[T](
    Map("id" -> "id", 
     "timestamp" -> "ts")) 

    def doSomeStuff(operations: CassandraTableScanRDD[T]): Unit = { 
    println("do some stuff here") 
    } 
} 

をしかし、私は信じて、次のエラー、に実行しているよ、私はRowReaderFactoryに渡していたという事実によるものですRowReaderFactoryのマッピングを正しく指定していません。 RowReaderFactoryのマッピング情報を指定する方法はありますか?

Exception in thread "main" java.lang.IllegalArgumentException: Failed to map constructor parameter timestamp in Bar to a column of MyNamespace 
    at com.datastax.spark.connector.mapper.DefaultColumnMapper$$anonfun$4$$anonfun$apply$1.apply(DefaultColumnMapper.scala:78) 
    at com.datastax.spark.connector.mapper.DefaultColumnMapper$$anonfun$4$$anonfun$apply$1.apply(DefaultColumnMapper.scala:78) 
    at scala.Option.getOrElse(Option.scala:120) 
    at com.datastax.spark.connector.mapper.DefaultColumnMapper$$anonfun$4.apply(DefaultColumnMapper.scala:78) 
    at com.datastax.spark.connector.mapper.DefaultColumnMapper$$anonfun$4.apply(DefaultColumnMapper.scala:76) 
    at scala.collection.TraversableLike$WithFilter$$anonfun$map$2.apply(TraversableLike.scala:722) 
    at scala.collection.immutable.List.foreach(List.scala:318) 
    at scala.collection.TraversableLike$WithFilter.map(TraversableLike.scala:721) 
    at com.datastax.spark.connector.mapper.DefaultColumnMapper.columnMapForReading(DefaultColumnMapper.scala:76) 
    at com.datastax.spark.connector.rdd.reader.GettableDataToMappedTypeConverter.<init>(GettableDataToMappedTypeConverter.scala:56) 
    at com.datastax.spark.connector.rdd.reader.ClassBasedRowReader.<init>(ClassBasedRowReader.scala:23) 
    at com.datastax.spark.connector.rdd.reader.ClassBasedRowReaderFactory.rowReader(ClassBasedRowReader.scala:48) 
    at com.datastax.spark.connector.rdd.reader.ClassBasedRowReaderFactory.rowReader(ClassBasedRowReader.scala:43) 
    at com.datastax.spark.connector.rdd.CassandraTableRowReaderProvider$class.rowReader(CassandraTableRowReaderProvider.scala:48) 
    at com.datastax.spark.connector.rdd.CassandraTableScanRDD.rowReader$lzycompute(CassandraTableScanRDD.scala:59) 
    at com.datastax.spark.connector.rdd.CassandraTableScanRDD.rowReader(CassandraTableScanRDD.scala:59) 
    at com.datastax.spark.connector.rdd.CassandraTableRowReaderProvider$class.verify(CassandraTableRowReaderProvider.scala:147) 
    at com.datastax.spark.connector.rdd.CassandraTableScanRDD.verify(CassandraTableScanRDD.scala:59) 
    at com.datastax.spark.connector.rdd.CassandraTableScanRDD.getPartitions(CassandraTableScanRDD.scala:143) 

答えて

1

次のようにあなたは、Fooののコンパニオンオブジェクトにその暗黙的に定義することができます。

object Foo { 
    implicit object Mapper extends JavaBeanColumnMapper[T](
    Map("id" -> "id", 
     "timestamp" -> "ts")) 
} 

そのクラスの暗黙のインスタンスを検索しようとしたときにScalaはクラスのコンパニオンオブジェクトになります。必要に応じて、暗黙的に必要なスコープで定義できますが、コンパニオンオブジェクトを追加して、必要なときに繰り返す必要はありません。

1

columnMapperFooのインスタンスが作成されたスコープではなく、Foo自体で作成されなければならないことがわかります。

関連する問題