我编写了一个方法来将数据从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))
我不知道为什么。
请帮帮我,谢谢!
答案 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
}