繁体   English   中英

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

[英]Scala wrapping method of a parametrized class (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._为: 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 docs中的示例有类似的问题:

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"))

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

saveAsCassandraTable需要3个隐式参数。 第一个( connector )具有默认值,后两个( rwfcolumnMapper )不在saveResultsToCassandra方法的隐式范围内,因此,该方法无法编译。

如果您需要有关隐式的更多信息,请查看另一个问题的答案

如果您之前已定义表( TableDef ),则将saveResultsToCassandra转换为以下函数应该可以。

def saveResultsToCassandra()(
  // implicit parameters as a separate list!
  implicit rwf: RowWriterFactory[T], 
  columnMapper: ColumnMapper[T]
) {
  rdd.saveAsCassandraTable("ks_name", "table_name")
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM