Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将mongodb oplog.rs加载到spark数据帧_Mongodb_Scala_Apache Spark_Spark Dataframe - Fatal编程技术网

将mongodb oplog.rs加载到spark数据帧

将mongodb oplog.rs加载到spark数据帧,mongodb,scala,apache-spark,spark-dataframe,Mongodb,Scala,Apache Spark,Spark Dataframe,我试图将oplog.rs从MongoDB加载到spark数据帧中,它加载元数据,并通过printSchema函数对其进行验证,但当我尝试执行show或count之类的操作时,它会给出以下错误scala.MatchError:((BsonMinKey,null),0)(属于scala.Tuple2类)。我也试着将它注册为一个诱人的,但仍然会出现同样的错误 val customReadConfig = ReadConfig(Map( "uri" -> "mongodb://use

我试图将oplog.rs从MongoDB加载到spark数据帧中,它加载元数据,并通过
printSchema
函数对其进行验证,但当我尝试执行show或count之类的操作时,它会给出以下错误
scala.MatchError:((BsonMinKey,null),0)(属于scala.Tuple2类)
。我也试着将它注册为一个诱人的,但仍然会出现同样的错误

val customReadConfig = ReadConfig(Map(
  "uri" -> 
    "mongodb://username:password@host_name:port/local.oplog.rs?authSource=xxxxx"
))

val dataframe = sqlContext.read.format("com.mongodb.spark.sql").
  options(customReadConfig.asOptions).load
为子孙后代:

Mongo>=3.2版本的默认分区器是
MongoSamplePartitioner
,它使用(像所有其他分区器一样)一个
partitionKey
,当它创建分区时,它使用
BsonMinKey
BsonMaxKey
来定义每个分区的边界。您遇到的匹配错误可能发生在以下位置:

  def createPartitions(partitionKey: String, splitKeys: Seq[BsonValue], 
      locations: Seq[String] = Nil, addMinMax: Boolean = true): 
      Array[MongoPartition] = {
        val minKeyMaxKeys = (new BsonMinKey(), new BsonMaxKey())
        val minToMaxSplitKeys: Seq[BsonValue] = if (addMinMax) minKeyMaxKeys._1 +: splitKeys :+ minKeyMaxKeys._2 else splitKeys
        val minToMaxKeysToPartition = if (minToMaxSplitKeys.length == 1) minToMaxSplitKeys else minToMaxSplitKeys.tail
        val partitionPairs: Seq[(BsonValue, BsonValue)] = minToMaxSplitKeys zip minToMaxKeysToPartition
        partitionPairs.zipWithIndex.map({
           case ((min: BsonValue, max: BsonValue), i: Int) => MongoPartition(i, createBoundaryQuery(partitionKey, min, max), locations)
      }).toArray
}
该错误告诉您的是,您的
max
被设置为null,正如您在代码中看到的,只有一个案例得到了处理。如果您没有设置要使用的
分区键
,则默认情况下分区程序将使用
\u id
,您可以了解它

默认情况下,
oplog.rs
集合没有
\u id
键,oplog记录的唯一id是名称惊人的
h
,它是一个数字。因此,为了让分区程序做正确的事情,您需要在
SparkConf
ReadConfig
中设置
spark.mongodb.input.partitionerOptions.partitionKey
h

 new SparkConf()
   //all of your other settings
   .set("spark.mongodb.input.partitionerOptions.partitionKey", "h")