我在Spark中使用mongo-hadoop client(r1.5.2)从mongoDB和bson中读取数据,该链接如下:https://github.com/mongodb/mongo-hadoop/wiki/Spark-Usage。到目前为止,我可以毫无问题地从mongoDB读取数据。但是,bson配置甚至无法编译。请帮忙。
我在scala中的代码:
dataConfig.set("mapred.input.dir", "path.bson")
val documents = sc.newAPIHadoopRDD(
dataConfig,
classOf[BSONFileInputFormat],
classOf[Object],
classOf[BSONObject])
错误:
Error:(56, 24) inferred type arguments [Object,org.bson.BSONObject,com.mongodb.hadoop.mapred.BSONFileInputFormat] do not conform to method newAPIHadoopRDD's type parameter bounds [K,V,F <: org.apache.hadoop.mapreduce.InputFormat[K,V]]
val documents = sc.newAPIHadoopRDD(
^
最佳答案
我找到了解决方案!
该问题似乎是由InputFormat的泛型引起的
newAPIHadoopRDD要求输入格式为
F <: org.apache.hadoop.mapreduce.InputFormat[K,V]
尽管BSONFileInputFormat扩展了FileInputFormat [K,V]并扩展了InputFormat [K,V],但它没有将K,V泛型指定为Object和BSONObject。
(实际上,BSONFileInputFormat中未提到K,V泛型,该类真的可以编译吗?)。
无论如何,解决方案是将BSONFileInputFormat转换为定义了K和V的InputFormat的子类:
val documents = sc.newAPIHadoopRDD(
dataConfig,
classOf[BSONFileInputFormat].asSubclass(classOf[org.apache.hadoop.mapreduce.lib.input.FileInputFormat[Object, BSONObject]]),
classOf[Object],
classOf[BSONObject])
现在它可以正常工作了:)
关于mongodb - Spark无法使用mongo-hadoop-connector的BSONFileInputFormat编译newAPIHadoopRDD,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37938695/