火花地图中的Scala typemismatch

时间:2018-01-23 07:58:14

标签: scala apache-spark

我编写了一个方法来将数据从mongodb(版本:3.4)加载到spark(使用mongo-spark-connector,版本:2.2.1),我的spark版本是2.2.0,scala版本是2.11.8。我想使用一个名为resultHandler的函数接受org.bson.Document并将T返回给etl mongodb原始数据。

def loadFromMongodb[T1: ClassTag](
                                    mongoUri: String,
                                    spark: SparkSession,
                                    pipeline: Seq[Document]
                                  )(
                                    resultHandler: Document => T1
                                  ): RDD[T1] = {
    spark
      .sparkContext
      .loadFromMongoDB(ReadConfig(Map("uri" -> mongoUri)))
      .withPipeline(pipeline) // filter push down
      .map(doc => resultHandler(doc))
  }

当我编译它时,我在这里遇到了类型不匹配错误:

Error:(50, 33) type mismatch;
   found   : T1
   required: org.bson.Document
      .map(doc => resultHandler(doc))

我不知道为什么。

请帮帮我,谢谢!

1 个答案:

答案 0 :(得分:0)

看起来你对mongo-spark-connector太聪明了,或者至少在你聪明和mongo-spark-connector与其隐含的DefaultsTo魔法之间存在冲突。

我没有挖掘整个故事,但事实上,您为T1提供了ClassTag[T1]的隐含证据,足以使该行

.loadFromMongoDB(ReadConfig(Map("uri" -> mongoUri)))

被解释为

.loadFromMongoDB[T1](ReadConfig(Map("uri" -> mongoUri)))

这显然不是你想要的。修复错误的最简单方法是使用{/ 1}}明确键入错误,如

Document

}