このブログを検索

2013/02/08

TASK#2 PHPで年月日でGroup byしてカウントする方法


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:1

CSVでデータを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 件のコメント:

コメントを投稿