参数化类的Scala包装方法(spark-cassandra-connector)

时间:2015-06-27 16:50:33

标签: scala cassandra apache-spark spark-cassandra-connector

我正在编写一组扩展Spark RDD API的方法。 我必须实现一个存储RDD的通用方法,并且一开始我尝试包装spark-cassandra-connector的saveAsCassandraTable,但没有成功。

这是“扩展RDD的API”部分:

object NewRDDFunctions {
  implicit def addStorageFunctions[T](rdd: RDD[T]):
  RDDStorageFunctions[T] = new RDDStorageFunctions(rdd)
}

class RDDStorageFunctions[T](rdd: RDD[T]) {
  def saveResultsToCassandra() {
    rdd.saveAsCassandraTable("ks_name", "table_name")    // this line produces errors!
  }
}

...并将对象导入为:import ...NewRDDFunctions._

标记的行会产生以下错误:

Error:(99, 29) could not find implicit value for parameter rwf: com.datastax.spark.connector.writer.RowWriterFactory[T]
    rdd.saveAsCassandraTable("ks_name", "table_name")
                            ^

Error:(99, 29) not enough arguments for method saveAsCassandraTable: (implicit connector: com.datastax.spark.connector.cql.CassandraConnector, implicit rwf: com.datastax.spark.connector.writer.RowWriterFactory[T], implicit columnMapper: com.datastax.spark.connector.mapper.ColumnMapper[T])Unit.
Unspecified value parameters rwf, columnMapper.
    rdd.saveAsCassandraTable("ks_name", "table_name")
                            ^

我不明白为什么这不起作用,因为saveAsCassandraTable旨在处理任何RDD。有什么建议吗?

我在spark-cassandra-connector文档中遇到example的类似问题:

case class WordCount(word: String, count: Long)
val collection = sc.parallelize(Seq(WordCount("dog", 50), WordCount("cow", 60)))
collection.saveAsCassandraTable("test", "words_new", SomeColumns("word", "count"))

...解决方案是将案例类定义移出“主要”功能(但我不知道这是否适用于上述问题......)。

1 个答案:

答案 0 :(得分:3)

saveAsCassandraTable需要3个隐含参数。第一个(db_array_update("all_data",array('last_fetched' =>date("Y/m/d H:i:s"),'name'=>$name, 'creation'=>$creat, 'expiration' =>$expire,"id=".$res['id']); )具有默认值,后两个(connectorrwf)不在columnMapper方法的隐式范围内,因此您的方法不编译。

如果您需要有关implicits的更多信息,请查看另一个问题answer

如果您之前已经定义了表格(saveResultsToCassandra),那么将saveResultsToCassandra转换为下面的函数应该有效。

TableDef