Почему 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.