mongodb 在slave中统计数据,然后保存到master的表中的javascript脚本代码

需求是这样的,我需要统计slave中的前一天的数据,然后将这些数据存入master的表中(要考虑到slave不能写的限制)。

mongo 192.168.1.48:27017/l_comment;
var map = function() {
    var date = new Date();
        date.setDate(date.getDate() - 1);
        var d = date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate();
              emit({rootId:this.rootId,date:d,type:parseInt(this.type)},
                    { 
sum:1,
status:this.status,boardId:this.boardId,
       currBoardId:this.currBoardId,reblogNum:0,likeNum:0,replyNum:0});
                    };
var reduce = function(key, values){
var reblogNum = 0;
var likeNum=0; 
var replyNum=0;
var sum = 0;
var type = key.type;
        var date = new Date();
        date.setDate(date.getDate() - 1);
        var d = date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate();
for(var i=0;i < values.length;i++) 
 {
 var val = values[i];
                  reblogNum += val.reblogNum;
                  likeNum += val.likeNum; replyNum += val.replyNum;
 var status=parseInt(val.status);
 var boardId= val.boardId;
 var currBoardId =  val.currBoardId;
 if(status==11 && currBoardId > 0) {
    reblogNum = reblogNum + 1;
  } else if(status==12 && currBoardId > 0) {
       likeNum = likeNum + 1;
  } else if(status ==0 && boardId > 0) {
    replyNum= replyNum + 1;
 }
 }
 sum =reblogNum + replyNum + likeNum;
 return {sum:NumberInt(sum),reblogNum:NumberInt(reblogNum),replyNum:NumberInt(replyNum),likeNum:NumberInt(likeNum)};
};


var prevous = function() {
   var date = new Date();
   date.setDate(date.getDate() - 2);
   return (date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate() + ' 23:59:59');
};
var after = function() {
    var date = new Date();
   date.setDate(date.getDate());
   return date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate();
};
var data = db.comment.mapReduce(
    map,
    reduce,    
   {
    query : {
        createTime:{$gt:prevous(),$lt:after()}
    },
    out:{inline:1}
   }
);
var mydb = connect('192.168.1.48:27017/l_comment');
var results = data.results;
for (var i = 0; i < results.length; i++) {
   var obj = results[i];
   var rootId = obj._id.rootId;
   var date = obj._id.date;
   var type = obj._id.type;
   var _id = obj._id;
   var sum = obj.value.sum;
   mydb.comm_day_num.insert({'_id':{rootId:rootId,date:date},rootId:rootId,type:type,sum:sum,date:date});
}


### 回答1: 可以使用Spark SQL连接MongoDB,对数据进行统计分析,然后将结果保存到MySQL。 具体步骤如下: 1. 首先,需要在Spark引入MongoDB的驱动程序,可以使用以下代码: ``` spark-shell --packages org.mongodb.spark:mongo-spark-connector_2.11:2.4.1 ``` 2. 然后,使用Spark SQL连接MongoDB,读取数据并进行统计分析,可以使用以下代码: ``` val df = spark.read.format("com.mongodb.spark.sql.DefaultSource") .option("uri", "mongodb://localhost/test.coll") .load() df.createOrReplaceTempView("data") val result = spark.sql("SELECT COUNT(*) FROM data WHERE age > 20") result.show() ``` 3. 最后,将结果保存到MySQL,可以使用以下代码: ``` result.write.format("jdbc") .option("url", "jdbc:mysql://localhost:3306/test") .option("dbtable", "result") .option("user", "root") .option("password", "password") .save() ``` 其,url、dbtable、user和password需要根据实际情况进行修改。 以上就是使用Spark SQL连接MongoDB,对数据进行统计分析,并将结果保存到MySQL的步骤。 ### 回答2: MongoDB是一种NoSQL数据库,而Spark是一种分布式计算框架。它们可以协同工作,以便在处理大规模数据时提高效率和速度。但是,在将MongoDB数据转化为Spark SQL进行统计分析之后,我们可能需要将数据保存到MySQL数据库。下面是如何使用Spark SQL和Scala将MongoDB数据转化为并保存到MySQL数据库。 首先,我们需要使用MongoDB的Spark Connector连接MongoDB。在使用Spark Shell进行连接时,我们需要使用以下命令导入依赖项: ``` import com.mongodb.spark._ import org.apache.spark.sql._ ``` 然后,我们可以使用以下代码连接到MongoDB数据库: ``` val spark = SparkSession.builder() .appName("MongoDB with SparkSQL") .master("local[*]") .config("spark.mongodb.input.uri", "mongodb://localhost/test.myCollection") .config("spark.mongodb.output.uri", "mongodb://localhost/test.outCollection") .getOrCreate() val df = spark.read.mongo() ``` 这将返回一个DataFrame,我们可以使用Spark SQL进行数据分析和处理。例如,我们可以使用以下代码对数据进行聚合: ``` val aggregationResultDF = df.groupBy("field1").agg(sum("field2")) ``` 出于安全考虑,我们可以在保存到MySQL之前对数据进行清洗和转换。然后,我们可以使用以下代码将结果保存到MySQL: ``` val mysqlConnectionProperties = new Properties() mysqlConnectionProperties.setProperty("user", "root") mysqlConnectionProperties.setProperty("password", "123456") mysqlConnectionProperties.setProperty("driver", "com.mysql.jdbc.Driver") aggregationResultDF.write.mode("append").jdbc("jdbc:mysql://localhost/db", "table", mysqlConnectionProperties) ``` 这将把结果保存到名为“table”的MySQL表中。 总之,使用Spark SQL和Scala将MongoDB数据转化为并保存到MySQL数据库是相对容易的。我们只需连接到MongoDB数据库,将其转换为DataFrame,聚合和处理数据,然后将结果写入MySQL。这可以为我们提供一个强大的数据处理工具,可用于处理大量数据并进行大规模分析。 ### 回答3: MongoDB是一个基于文档的非关系型数据库系统,而Spark SQL是一个基于Spark的模块,可以通过其数据源API轻松访问各种结构化数据源,包括MongoDB数据库。Mysql则是一个高度可扩展的关系型数据库管理系统,广泛用于Web应用程序。为了将MongoDB的数据统计并保存到Mysql,我们可以使用MongoDB-Spark Connector和MySQL Connector for Java。 MongoDB-Spark Connector使我们可以轻松地将MongoDB集合转换为DataFrame数据结构,使我们可以随意使用Spark SQL的各种高级特性和功能来处理MongoDB的数据。可以使用MongoDB-Spark Connector建立连接,并使用其提供的API来读取MongoDB的数据。例如,以下代码将创建一个名为“students”的DataFrame,其包含MongoDB具有“name”和“age”字段的所有记录: ``` val students = spark.read.format("com.mongodb.spark.sql.DefaultSource").option("uri","mongodb://localhost/test.students").load() ``` 接下来,我们可以使用Spark SQL来对这些数据进行各种统计操作和计算。例如,以下命令将计算姓名为“Tom”的学生的平均年龄: ``` import org.apache.spark.sql.functions._ students.filter($"name" === "Tom").agg(avg("age")) ``` 一旦我们完成了Spark SQL的统计和计算过程,我们需要将结果保存到Mysql数据库。为此,我们可以使用Mysql Connector for Java建立连接,并使用其提供的API将数据写入Mysql数据库。以下代码展示了如何使用Mysql Connector for Java来将数据框的数据写入名为“results”的表中: ``` val properties = new Properties() properties.put("user", "root") // MySQL用户名 properties.put("password", "root") // MySQL登录密码 result.write.mode("append").jdbc("jdbc:mysql://localhost/test", "results", properties) ``` 此外,我们还可以使用Spark的Parallelize功能将结果保存到HDFS等分布式文件系统。 总之,在将MongoDB的数据统计并保存到Mysql的整个过程,我们可以利用Spark SQL和相关的连接器库(MongoDB-Spark Connector和MySQL Connector for Java)来快速方便地实现,从而提高大规模数据处理的效率和精度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值