将mongodb oplog.rs加载到spark数据帧
我试图将oplog.rs从MongoDB加载到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
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")