2017-10-09 52 views
8

我正在評估一個項目的Mongo Spark連接器,並得到不一致的結果。我在我的筆記本電腦上使用MongoDB服務器版本3.4.5,Spark(通過PySpark)2.2.0,Mongo Spark Connector版本2.11; 2.2.0本地。對於我的測試數據庫,我使用安全數據集http://mongodb-enron-email.s3-website-us-east-1.amazonaws.com/我對Spark SQL查詢感興趣,當我開始運行簡單測試查詢計數時,我收到每次運行的不同計數。 這裏是我的蒙戈外殼輸出:爲什麼Mongo Spark連接器爲查詢返回不同的和不正確的計數?

> db.messages.count({'headers.To': '[email protected]'}) 
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='[email protected]'") 
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='[email protected]'") 
In [7]: res.show() 
+----------+                  
|count(_id)| 
+----------+ 
|  161| 
+----------+ 
In [8]: res.show() 
+----------+                  
|count(_id)| 
+----------+ 
|  162| 
+----------+ 

我在谷歌搜索關於這個問題,但我沒有發現任何有用的。如果有人有任何想法爲什麼會發生這種情況,以及如何正確處理這個問題,請分享您的想法我有一種感覺,也許我錯過了某些東西,或者某些東西配置不當。

更新: 我解決了我的問題。計數不一致的原因是MongoDefaultPartitioner其中包含MongoSamplePartitioner它使用隨機採樣。說實話,這對我來說是一個相當奇怪的默認設置。我個人寧願有一個緩慢但一致的分區程序。分區選項的詳細信息可在官方的configuration options文檔中找到。

UPDATE: 將解答覆制到答案中。

回答

6

我解決了我的問題。計數不一致的原因是MongoDefaultPartitioner其中包含MongoSamplePartitioner它使用隨機採樣。說實話,這對我來說是一個相當奇怪的默認設置。我個人寧願有一個緩慢但一致的分區程序。分區選項的詳細信息可在官方configuration options文檔中找到。

代碼:

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() 
+0

'()'不在階強制性的。 – mrsrinivas

+0

@mrsrinivas哦,對不起,我不知道。我之前檢查了幾個scala示例,它們都使用.load()。 – artemdevel

相關問題