SELECT DATE_FORMAT( `create_date` , '%Y/%m/%d %H:00:00' ), COUNT(user_id) FROM user_table GROUP BY DATE_FORMAT(`create_date`, '%Y%m%d %H') の実装方法
(1)mapreduceでjavascriptのdateformatを使って文字列を日付に変換させようとしたが、次のエラーが出て失敗。
exception: map invoke failed: JS Error: ReferenceError: DateFormat is not defined nofile_b:1CSVでデータをImportしたときは
日付のGroup Byをしたい場合は「年/月/日/時/分/秒」等で分類して持った方がやりやすいかも。
(2)Mapreduce関数を利用した(Scopeも利用した)
// get yyyyMMddのScope機能も利用 $scopeFunction = "function (y,m,d) { if ( m < 10) {m = '0' + m;} if ( d < 10) {d = '0' + d;} return y + m + d; }"; $scope = new MongoCode($scopeFunction); // MongcodeでScopeを利用 // map 関数と reduce 関数を作ります $map = new MongoCode("function() { var group_key = getYyyyMMdd(this.create_date_y,this.create_date_m,this.create_date_d); emit(group_key,1); }"); //GroupByのcreate_dateになるキー $reduce = new MongoCode("function(k, vals) { var count = 0; // 初期化 for (var i in vals) { count += vals[i]; //count up } return count; }");
// phpのCommandで実行
$result = $db->command(array(
"mapreduce" => "collection",
"map" => $map,
"reduce" => $reduce,
"scope" => array("getYyyyMMdd"=>$scope), // この設定に注意
"out" => array("replace"=>"new_user_daily_count")
));
$cur_daily_counts = $db->selectCollection($result['result'])->find();
0 件のコメント:
コメントを投稿