有代码,配合代码 一起看 3.2 使用MapReduce对数据进行清洗,把原始数据清洗后,放到hdfs的/hmbbs_cleaned目录下,每天产生一个子目录。 3.3 使用hive对清洗后的数据进行统计,如何处理?如下: 3.3.1 建立一个外部分区表,脚本如下(为什么是外部的,因为我们清洗后的数据放到/hmbbs_cleaned下,2分左右,再仔细看,回头看看分区别是什么,然后在来体会一下。) CREATE EXTERNAL TABLE hmbbs(ip string, atime string, url string) PARTITIONED BY (logdate string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' LOCATION '/hmbbs_cleaned'; 3.3.2 增加分区,脚本如下 ALTER TABLE hmbbs ADD PARTITION(logdate='2013_05_30') LOCATION '/hmbbs_cleaned/2013_05_30'; 上面这个命令应该放到脚本中。原因:Hive中的每个分区,对应数据库文件夹下的一个子文件夹,在创建表的时候,可以看出,我们是按时间进行分区的,而且我们的日志是每天产生一次,所以我们每天都要创建一个分区,所以每天会产生一个分区的目录,该目录中放了我们清洗后的文件,那么每天都需要加一个分区。自然就要每天执行一次这个语句。 把代码增加到upload_to_hdfs.sh中,内容如下 hive -e "ALTER TABLE hmbbs ADD PARTITION(logdate='${yesterday}') LOCATION '/hmbbs_cleaned/${yesterday}';" hive -e的意思是在hive环境之外执行hive命令,我们之前执行的命令时,最开始都执行一个hive命令,此时进入了hive的终端(命令行), 然后执行语句,但是如果我们执行quit命令,退出hive终端,再执行上述命令,是不可以的,需要加上hive -e+命令,命令需要用引号括起来。 3.3.3 统计每日的pv,代码如下 CREATE TABLE hmbbs_pv_2013_05_30 AS SELECT COUNT(1) AS PV FROM hmbbs WHERE logdate='2013_05_30'; 统计每日的注册用户数,代码如下 CREATE TABLE hmbbs_reguser_2013_05_30 AS SELECT COUNT(1) AS REGUSER FROM hmbbs WHERE logdate='2013_05_30' AND INSTR(url,'member.php?mod=register')>0; 统计每日的独立ip,代码如下 CREATE TABLE hmbbs_ip_2013_05_30 AS SELECT COUNT(DISTINCT ip) AS IP FROM hmbbs WHERE logdate='2013_05_30'; 统计每日的跳出用户,代码如下 CREATE TABLE hmbbs_jumper_2013_05_30 AS SELECT COUNT(1) AS jumper FROM (SELECT COUNT(ip) AS times FROM hmbbs WHERE logdate='2013_05_30' GROUP BY ip HAVING times=1) e; 把每天统计的数据放入一张表(其实不合并,也可以,不过用SQOOP导出的时候,mysql那里也需要有4个表去接收) (我们既然都用了selecet语句了,应该就会产生数据了,为什么非要创建一个表,因为sqoop导出的只能是表目录,你给他一个select语句,他搞不明白。) CREATE TABLE hmbbs_2013_05_30 AS SELECT '2013_05_30', a.pv, b.reguser, c.ip, d.jumper FROM hmbbs_pv_2013_05_30 a JOIN hmbbs_reguser_2013_05_30 b ON 1=1 JOIN hmbbs_ip_2013_05_30 c ON 1=1 JOIN hmbbs_jumper_2013_05_30 d ON 1=1 ; 创建如上4个表的目的就是要把这四个hive表中的数据导入到mysql中。 3.4 使用sqoop把数据导出到mysql中(需要创建数据库,并且创建需要导出到的那张表) 默认分隔符(分割列的) 这个目录应该是hdfs中的,因为我们hive创建的表是放在hdfs中,也就是说,我们通过表连接合并成一个表之后,这个表存放在hdfs中的位置的地址 sqoop export --connect jdbc:mysql://hadoop0:3306/hmbbs --username root --password admin --table hmbbs_logs_stat --fields-terminated-by ' 01' --export-dir /usr/hive/warehouse/hmbbs_2013_05_30 3.5完善执行的批量脚本 3.5.1初始化数据(对历史数据进行处理) 3.5.2每日执行的脚本(就是把历史数据执行完了,然后对每天产生的文件进行处理) hive删除表命令 drop table 表名 查看hive中的函数 进入hive 执行 show function命令 查看某一个函数的具体信息 discribe function 函数名