用过MongoDB的小伙伴或多或少都会遇到MongoDB自带group的限制问题,即group不支持大于2万的结果集!
我曾在任职公司做过某网站小区均价数据抓取,采用的是Groovy技术。数据抓取下来后存放在MongoDB中。数据抓取完成都是需要经历数据清洗处理的,其中有一项数据去重时候就遇到MongoDB自带group的限制问题,即group不支持大于2万的结果集。几番折腾后来采用MongoDB mapReduce来处理。
下面是数据去重的部分核心代码,已做脱敏处理!
package com.script.thirdPriceCrawl
import com.script.util.MongoUtils
import com.mongodb.BasicDBObject
import com.mongodb.DB
import com.mongodb.DBCollection
import com.mongodb.DBObject
import com.mongodb.MapReduceOutput
import org.apache.commons.lang.StringUtils
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
import java.util.concurrent.TimeUnit
/**
* 网络爬虫:
* 某网站-小区均价数据抓取<br>
* http://www.xxx.com/
*
* 解析完成后通过MapReduce统计/清理重复数据工具类<br>
* 在清洗数据脚本执行之前调用
*
* @author 小辉哥/小辉GE
* 2019年9月5日 下午21:22:12
*
*/
class ThirdPartPriceDataRepeatBatchUtils {
//MapReduce 执行分组后输出DBCollection
def static final THIRD_PARTY_PRICE_DATAREPEAT_TEMP = "third_party_price_repeat_data_temp"
def static final THIRD_PARTY_PRICE_DATAPRICEREPEAT_TEMP = "third_party_price_repeat_dataprice_temp"
//线程池
def static ExecutorService fixedThreadPoolQuery
//其他变量
def static final CONNECT_CHAR = "#####"
/**
* 每次执行时候初始化线程池, 防止类已加载就要多个线程池中线程占用内存
* @param type
* @return
*/
def static initThreadPool(){
fixedThreadPoolQuery = Executors.newFixedThreadPool(50)
}
/**
* 全量测试执行时间为277分钟, 预计执行时间为五小时
*
* 返回当月总解析后重复数据
* 判断分组标准:s_date+source+city+region+name
* 备注:方法在解析完成清洗开始前执行