У меня авторизация включена на уровне базы данных (поэтому для чтения базы данных необходимо указать имя пользователя и пароль, а не входить в mongodb), и я пытаюсь прочитать данные из коллекцию mongodb в RDD с использованием MongoSpark.load ().
Я указал readConfig как:
val readConfig = ReadConfig(Map("spark.mongodb.input.uri" ->
"mongodb://<username>:<password>@<mongo-host>:<mongo-port = 27017>/<db-name>.<collection-name>",
"spark.mongodb.input.partitioner" -> "MongoSplitVectorPartitioner"))
Я прочитал СДР и отфильтровал его по предопределенному столбцу как:
val rdd = MongoSpark.load(sc, readConfig).withPipeline(Seq(Document.parse("{ $match: {\"isSatisfyingCondition\" :{$eq: true} } }"))).toDf
val processedRdd = rdd.select("_id", "col1").collect()
Я получаю следующую ошибку в строке processingRdd из-за действия collect ():
User class threw exception: com.mongodb.MongoCommandException: Command failed with error 13: 'not authorized on <db-name> to execute command { splitVector: "<db-name>.<collection-name>",
Моя интуиция заключается в том, что я не передаю имя пользователя и пароль явно разделителю и должен это делать, чтобы он мог обращаться к базе данных / читать ее.
Как передать имя пользователя и пароль, чтобы разрешить их использование в базе данных? Или я вообще смотрю не туда и причина этой ошибки другая?
Этот пользователь не является администратором. Я могу подключиться к базе данных из командной строки, используя следующую команду:
mongo <db-name> --host <mongo-host>:<mongo-port> --username <username> --password <password>
ОБНОВЛЕНИЕ (вопрос все еще не решен): Когда я удаляю разделитель из readConfig, ошибки нет. Может ли кто-нибудь объяснить, как указание разделителя в readConfig связано с этой ошибкой?
После удаления разделителя readConfig теперь читает:
val readConfig = ReadConfig(Map("spark.mongodb.input.uri" ->
"mongodb://<username>:<password>@<mongo-host>:<mongo-port = 27017>/<db-name>.<collection-name>"))