我在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/

10-09 20:16