需求
場景:統計每日用戶登陸總數
每分鍾的原始日志內容如下:
http://www.blue.com/uid=xxxxxx&ip=xxxxxx
假設只有兩個字段,uid和ip,其中uid是用戶的uid,是用戶的唯一標識,ip是用戶的登陸ip,每日的記錄行數是10億,要統計出一天用戶登陸的總數。
處理流程
建表
那么我們首先要在hive里建表,建表語句如下:
CREATE TABLE login ( uid STRING, ip STRING ) PARTITIONED BY (dt STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE;
其實表名是login,字段之間以,隔開,存儲是TEXT,其次還以dt這個字段作為分區。
創建成功之后,會看到hdfs上創建了/user/hive/warehouse/login這個目錄。
格式化原始日志
將每天的每分鍾的原始日志,轉換成以下文件格式
123,17.6.2.6 112,11.3.6.2 ………..
根據文件大小,合並文件,例如合並為24個文件。
入庫
格式完畢,就可以把數據入庫到hive了,假設今天是執行命令
LOAD DATA LOCAL INPATH '/data/login/20120713/*' OVERWRITE INTO TABLE login PARTITION (dt='20120713');
執行成功會,轉換過的文件會上傳到hdfs的/user/hive/warehouse/login/dt=20120713這個目錄里。
分析
在hive執行以下語句
select count(distinct uid) from login where dt=’ 20120713’;
使用dt這個分區條件查詢,就可以避免hive去查詢其他分區的文件,減少IO操作,這個是hive分區很重要的特性,也是以天為單位,作為login表分區的重要意義。
執行完畢后,就可以在命令里出現結果,一般通過管道執行hive shell命令,讀取管道的內容,把結果入庫到mysql里就完成了分析了。