传递给方法的 RDD 上的 saveToCassandra 失败并显示 scala.ScalaReflectionException:<none> 不是一个术语
saveToCassandra on RDD passed to method fails with scala.ScalaReflectionException: <none> is not a term
使用 Spark 2.1.0 和 spark-cassandra-connector 2.0.0-RC1-s_2.11。
当在与其他转换相同的函数内完成时,调用 rdd.saveToCassandra("keyspace", "table", SomeColumns("A", "B"))
工作正常。但是,在同一个对象上定义一个方法如下:
def saveToCassandra(rdd: RDD[_], keyspace: String, table: String, columns: SomeColumns) = {
rdd.saveToCassandra(keyspace, table, columns)
}
用 saveToCassandra(rdd, "keyspace", "table", SomeColumns("A", "B"))
调用失败:
Exception in thread "main" scala.ScalaReflectionException: <none> is not a term
at scala.reflect.api.Symbols$SymbolApi$class.asTerm(Symbols.scala:199)
at scala.reflect.internal.Symbols$SymbolContextApiImpl.asTerm(Symbols.scala:84)
at com.datastax.spark.connector.util.Reflect$.methodSymbol(Reflect.scala:12)
at com.datastax.spark.connector.util.ReflectionUtil$.constructorParams(ReflectionUtil.scala:63)
at com.datastax.spark.connector.mapper.DefaultColumnMapper.<init>(DefaultColumnMapper.scala:45)
at com.datastax.spark.connector.mapper.LowPriorityColumnMapper$class.defaultColumnMapper(ColumnMapper.scala:51)
at com.datastax.spark.connector.mapper.ColumnMapper$.defaultColumnMapper(ColumnMapper.scala:55)
使用 RDD 的类型标签定义辅助方法,例如rdd: RDD[(String, String)]
而不是 RDD[_]
解决问题。我想这与 datastax 连接器内部的反射代码以及它从编译时类型推断 运行 时类型的方式有关。显然将下划线作为任何类型擦除类型信息以进行反射。我对 Scala 有点陌生,不知道反射在 Scala 中是如何工作的,也不知道这种行为是否需要。
使用 Spark 2.1.0 和 spark-cassandra-connector 2.0.0-RC1-s_2.11。
当在与其他转换相同的函数内完成时,调用 rdd.saveToCassandra("keyspace", "table", SomeColumns("A", "B"))
工作正常。但是,在同一个对象上定义一个方法如下:
def saveToCassandra(rdd: RDD[_], keyspace: String, table: String, columns: SomeColumns) = {
rdd.saveToCassandra(keyspace, table, columns)
}
用 saveToCassandra(rdd, "keyspace", "table", SomeColumns("A", "B"))
调用失败:
Exception in thread "main" scala.ScalaReflectionException: <none> is not a term
at scala.reflect.api.Symbols$SymbolApi$class.asTerm(Symbols.scala:199)
at scala.reflect.internal.Symbols$SymbolContextApiImpl.asTerm(Symbols.scala:84)
at com.datastax.spark.connector.util.Reflect$.methodSymbol(Reflect.scala:12)
at com.datastax.spark.connector.util.ReflectionUtil$.constructorParams(ReflectionUtil.scala:63)
at com.datastax.spark.connector.mapper.DefaultColumnMapper.<init>(DefaultColumnMapper.scala:45)
at com.datastax.spark.connector.mapper.LowPriorityColumnMapper$class.defaultColumnMapper(ColumnMapper.scala:51)
at com.datastax.spark.connector.mapper.ColumnMapper$.defaultColumnMapper(ColumnMapper.scala:55)
使用 RDD 的类型标签定义辅助方法,例如rdd: RDD[(String, String)]
而不是 RDD[_]
解决问题。我想这与 datastax 连接器内部的反射代码以及它从编译时类型推断 运行 时类型的方式有关。显然将下划线作为任何类型擦除类型信息以进行反射。我对 Scala 有点陌生,不知道反射在 Scala 中是如何工作的,也不知道这种行为是否需要。