Почему Mongo Spark connector возвращает разные и неправильные подсчеты для запроса?
Я оцениваю Mongo Spark connector для проекта, и я получаю противоречивые результаты. Я использую MongoDB server версии 3.4.5, Spark (через PySpark) версии 2.2.0, Mongo Spark Connector версии 2.11;2.2.0 локально на моем ноутбуке. Для моей тестовой БД я использую набор данных Enronhttp://mongodb-enron-email.s3-website-us-east-1.amazonaws.com/ Меня интересуют SQL-запросы Spark, и когда я начал запускать простые тестовые запросы для count, я получил разные подсчеты для каждого запуска. Вот вывод из моей оболочки mongo:
> db.messages.count({'headers.To': 'eric.bass@enron.com'})
203
вот некоторые выходные данные из моей оболочки PySpark:
In [1]: df = spark.read.format("com.mongodb.spark.sql.DefaultSource").option("uri", "mongodb://127.0.0.1/enron_mail.messages").load()
In [2]: df.registerTempTable("messages")
In [3]: res = spark.sql("select count(*) from messages where headers.To='eric.bass@enron.com'")
In [4]: res.show()
+--------+
|count(1)|
+--------+
| 162|
+--------+
In [5]: res.show()
+--------+
|count(1)|
+--------+
| 160|
+--------+
In [6]: res = spark.sql("select count(_id) from messages where headers.To='eric.bass@enron.com'")
In [7]: res.show()
+----------+
|count(_id)|
+----------+
| 161|
+----------+
In [8]: res.show()
+----------+
|count(_id)|
+----------+
| 162|
+----------+
Я искал в Google об этой проблеме, но я не нашел ничего полезного. Если у кого-то есть идеи, почему это может произойти и как правильно с этим справиться, поделитесь своими идеями. У меня такое чувство, что, может быть, я что-то пропустил или что-то было неправильно настроено.
обновление: Я решил свою проблему. Причиной несогласованных подсчетов стала the MongoDefaultPartitioner который обертывает MongoSamplePartitioner который использует случайную выборку. Честно говоря, для меня это довольно странный дефолт. Я лично предпочел бы иметь вместо этого медленный, но последовательный разделитель. Подробную информацию о вариантах разделителя можно найти в официальном параметры конфигурации документация.
обновление: Скопировал решение в ответ.
2 ответов
Я решил свою проблему. Причиной несогласованных подсчетов было MongoDefaultPartitioner который обертывает MongoSamplePartitioner который использует случайную выборку. Честно говоря, для меня это довольно странный дефолт. Я лично предпочел бы иметь вместо этого медленный, но последовательный разделитель. Подробную информацию о вариантах разделителя можно найти в официальном параметры конфигурации документация.
код:
val df = spark.read
.format("com.mongodb.spark.sql.DefaultSource")
.option("uri", "mongodb://127.0.0.1/enron_mail.messages")
.option("partitioner", "spark.mongodb.input.partitionerOptions.MongoPaginateBySizePartitioner ")
.load()
эта проблема была в основном из-за Искра-151 ошибка в разъеме 2.2.0 Mongo. Он разрешен в версии 2.2.1, которую я подтвердил. Вы можете продолжать использовать разделитель по умолчанию с 2.2.1.