zoukankan      html  css  js  c++  java
  • 大文件日志快速解析入库

    100w行日志

    由左到右值分别是 book_id |  menu_id | userid

    我需要每天每个用户读了多少本书(不重复)多少章节,以及每本书有多少章节被阅读,以及每个章节的pv或者uv

    转成这样的结构存储 

    a、一条条解析,每条更新一遍where menuid 和booid的记录的pv和uv值
     
    b、一行行读取,将全部值入库到redis并在redis计算出pv和uv,最终读取完以后shell的load data文件形式导入到MySQL
     
    c、将原始数据入库MySQL,然后直接MySQL之中存储过程搞定
     
    获取不重复的记录数 count(distinct p_id)
    INSERT INTO book_read_log SELECT book_id,menu_id,COUNT(*) pv,COUNT(DISTINCT ggid) uv,time as date,platform FROM menu_access_log GROUP BY book_id,menu_id

    如果一行一行文件的读然后解析入库,不断地查表,100w行的文本,10个小时

    转redis一并计算好pv和uv之后,一并入库3小时

    使用MySQL的load data之后同库解析60s不到

    <?php
    
    $dbms='mysql';     //数据库类型
    $host='localhost'; //数据库主机名
    $dbName='test';    //使用的数据库
    $user='root';      //数据库连接用户名
    $pass='123456';          //对应的密码
    $dsn="$dbms:host=$host;dbname=$dbName";
    
    
    try {
        // 这里PDO::MYSQL_ATTR_LOCAL_INFILE => true需要设置
        $options = [PDO::MYSQL_ATTR_LOCAL_INFILE => true];
        $dbh = new PDO($dsn, $user, $pass,$options); //初始化一个PDO对象
        $file = 'user.log';//2,rose,18;
        $line_cut = ";".PHP_EOL;
        $sql = 'LOAD DATA LOCAL INFILE "'.$file.'" IGNORE INTO TABLE user CHARACTER SET "utf8" FIELDS TERMINATED BY "," LINES TERMINATED BY "'.$line_cut.'" (id,name,age);';
        $dbh->exec($sql);
        // 断开连接
        $dbh = null;
    } catch (PDOException $e) {
        exit($e->getMessage().PHP_EOL);
    }

    我表示非常满意load data这个,极速入库

    数据库表结构:

     

    日志文件格式:

    可以快速地将日志文件入库数据库

  • 相关阅读:
    【博弈论】K倍动态减法游戏
    【博弈论】翻硬币游戏8种模型
    P4124 [CQOI2016]手机号码(数位DP,前导0)
    AtCoder Beginner Contest 146
    Sumitomo Mitsui Trust Bank Programming Contest 2019
    ICPC 2018 Nanjing Regional
    模拟退火基础学习&模板
    AtCoder Beginner Contest 117
    AtCoder Beginner Contest 118
    AtCoder Beginner Contest 119
  • 原文地址:https://www.cnblogs.com/xuweiqiang/p/10660610.html
Copyright © 2011-2022 走看看