Hive进行ETL
一、数据清洗介绍
二、Hive数据清洗
1.本文使用的是一数据集为user.zip,包含了一个大规模数据集raw_user.csv(包含2000万条记录),和一个小数据集small_user.csv(只包含30万条记录)。小数据集small_user.csv是从大规模数据集raw_user.csv中抽取的一小部分数据。之所以抽取出一少部分记录单独构成一个小数据集,是因为,在第一遍跑通整个实验流程时,会遇到各种错误,各种问题,先用小数据集测试,可以大量节约程序运行时间。等到第一次完整实验流程都顺利跑通以后,就可以最后用大规模数据集进行最后的测试。
解压后查看前五行
[hadoop@master dataset]$ unzip user.zip Archive: user.zip inflating: raw_user.csv inflating: small_user.csv [hadoop@master dataset]$ ls raw_user.csv small_user.csv user.zip [hadoop@master dataset]$ head -5 raw_user.csv user_id,item_id,behavior_type,user_geohash,item_category,time10001082,285259775,1,97lk14c,4076,2014-12-08 1810001082,4368907,1,,5503,2014-12-12 1210001082,4368907,1,,5503,2014-12-12 1210001082,53616768,1,,9762,2014-12-02 1512345678910111213
2.可以看出,每行记录都包含5个字段,数据集中的字段及其含义如下:
user_id(用户id)
item_id(商品id)
behaviour_type(包括浏览、收藏、加购物车、购买,对应取值分别是1、2、3、4)
user_geohash(用户地理位置哈希值,有些记录中没有这个字段值,所以后面我们会用脚本做数据预处理时把这个字段全部删除)
item_category(商品分类)
time(该记录产生时间)
数据集的预处理
1.删除文件第一行记录,即字段名称
raw_user和small_user中的第一行都是字段名称,我们在文件中的数据导入到数据仓库Hive中时,不需要第一行字段名称,因此,这里在做数据预处理时,删除第一行
[hadoop@master dataset]$ sed -i '1d' raw_user.csv [hadoop@master dataset]$ sed -i '1d' small_user.csv [hadoop@master dataset]$ head -5 raw_user.csv 10001082,285259775,1,97lk14c,4076,2014-12-08 1810001082,4368907,1,,5503,2014-12-12 1210001082,4368907,1,,5503,2014-12-12 1210001082,53616768,1,,9762,2014-12-02 1510001082,151466952,1,,5232,2014-12-12 11[hadoop@master dataset]$ 12345678910
接下来的操作中,我们都是用small_user.csv这个小数据集进行操作,这样可以节省时间。等所有流程都跑通以后,你就可以使用大数据集raw_user.csv去测试一遍了。
2.对字段进行预处理
下面对数据集进行一些预处理,包括为每行记录增加一个id字段(让记录具有唯一性)、增加一个省份字段(用来后续进行可视化分析),并且丢弃user_geohash字段(后面分析不需要这个字段)。
下面我们要建一个脚本文件pre_deal.sh,请把这个脚本文件放在dataset目录下,和数据集small_user.csv放在同一个目录下:
#!/bin/bash#下面设置输入文件,把用户执行pre_deal.sh命令时提供的第一个参数作为输入文件名称infile=$1#下面设置输出文件,把用户执行pre_deal.sh命令时提供的第二个参数作为输出文件名称outfile=$2#注意!!最后的$infile > $outfile必须跟在}’这两个字符的后面awk -F "," 'BEGIN{ srand(); id=0; Province[0]="山东";Province[1]="山西";Province[2]="河南";Province[3]="河北";Province[4]="陕西";Province[5]="内蒙古";Province[6]="上海市"; Province[7]="北京市";Province[8]="重庆市";Province[9]="天津市";Province[10]="福建";Province[11]="广东";Province[12]="广西";Province[13]="云南"; Province[14]="浙江";Province[15]="贵州";Province[16]="新疆";Province[17]="西藏";Province[18]="江西";Province[19]="湖南";Province[20]="湖北"; Province[21]="黑龙江";Province[22]="吉林";Province[23]="辽宁"; Province[24]="江苏";Province[25]="甘肃";Province[26]="青海";Province[27]="四川"; Province[28]="安徽"; Province[29]="宁夏";Province[30]="海南";Province[31]="香港";Province[32]="澳门";Province[33]="台湾"; } { id=id+1; value=int(rand()*34); print id"\t"$1"\t"$2"\t"$3"\t"$5"\t"substr($6,1,10)"\t"Province[value] }' $infile > $outfile 上面的代码的基本形式是: awk -F "," '处理逻辑' $infile > $outfile 使用awk可以逐行读取输入文件,并对逐行进行相应操作。其中,-F参数用于指出每行记录的不同字段之间用什么字符进行分割,这里是用逗号进行分割。处理逻辑代码需要用两个英文单引号引起来。 $infile是输入文件的名称,我们这里会输入raw_user.csv,$outfile表示处理结束后输出的文件名称,我们后面会使用user_table.txt作为输出文件名称。 在上面的pre_deal.sh代码的处理逻辑部分,srand()用于生成随机数的种子,id是我们为数据集新增的一个字段,它是一个自增类型,每条记录增加1,这样可以保证每条记录具有唯一性。我们会为数据集新增一个省份字段,用来进行后面的数据可视化分析,为了给每条记录增加一个省份字段的值,这里,我们首先用Province[]数组用来保存全国各个省份信息,然后,在遍历数据集raw_user.csv的时候,每当遍历到其中一条记录,使用value=int(rand()*34)语句随机生成一个0-33的整数,作为Province省份值,然后从Province[]数组当中获取省份名称,增加到该条记录中。 substr($6,1,10)这个语句是为了截取时间字段time的年月日,方便后续存储为date格式。awk每次遍历到一条记录时,每条记录包含了6个字段,其中,第6个字段是时间字段,substr($6,1,10)语句就表示获取第6个字段的值,截取前10个字符,第6个字段是类似”2014-12-08 18″这样的字符串(也就是表示2014年12月8日18时),substr($6,1,10)截取后,就丢弃了小时,只保留了年月日。 另外,在print id”\t”$1″\t”$2″\t”$3″\t”$5″\t”substr($6,1,10)”\t”Province[value]这行语句中,我们丢弃了每行记录的第4个字段,所以,没有出现$4。我们生成后的文件是“\t”进行分割,这样,后续我们去查看数据的时候,效果让人看上去更舒服,每个字段在排版的时候会对齐显示,如果用逗号分隔,显示效果就比较乱。 最后,保存pre_deal.sh代码文件,退出vim编辑器。1234567891011121314151617181920212223242526272829303132
运行shell文件
[hadoop@master dataset]$ chmod +x ./predeal.sh [hadoop@master dataset]$ ./predeal.sh ./user_log.csv ./small_user_log.csv12
简单分析:
1、这里我们要在数据库dblab中创建一个外部表bigdata_user,它包含字段(id, uid, item_id, behavior_type, item_category, date, province),请在hive命令提示符下输入如下命令:
[hadoop@master /]$ hive SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/app/hive/apache-hive-2.1.1-bin/lib/log4j-slf4j-impl-2.4.1.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/app/hadoop/hadoop-2.7.3/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory] Logging initialized using configuration in file:/app/hive/apache-hive-2.1.1-bin/conf/hive-log4j2.properties Async: true Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases. hive> create database dblab; OK Time taken: 1.713 seconds hive> use dblab; OK Time taken: 0.039 seconds hive> show databases; OK dblabdefaultTime taken: 0.631 seconds, Fetched: 2 row(s) hive> use dblab; OK Time taken: 0.043 seconds hive> create external table dblab.bigdata_user(id int,uid string,item_id string,behavior_type int,item_category string,visit_date date,province string) comment'Welcome to xmu dblab!' row format delimited fields terminated by '\t' stored as textfile location '/bigdatacase/dataset' > ; OK Time taken: 0.757 seconds hive> select * from bigint bigint bigint( hive> select * from bigdata_user limit 10; OK1 10001082 285259775 1 4076 2014-12-08 浙江2 10001082 4368907 1 5503 2014-12-12 浙江3 10001082 4368907 1 5503 2014-12-12 江西4 10001082 53616768 1 9762 2014-12-02 甘肃5 10001082 151466952 1 5232 2014-12-12 辽宁6 10001082 53616768 4 9762 2014-12-02 西藏7 10001082 290088061 1 5503 2014-12-12 湖北8 10001082 298397524 1 10894 2014-12-12 陕西9 10001082 32104252 1 6513 2014-12-12 安徽10 10001082 323339743 1 10894 2014-12-12 江西 Time taken: 2.656 seconds, Fetched: 10 row(s) hive> select behavior_type from bigdata_user limit 10; OK1111141111Time taken: 0.216 seconds, Fetched: 10 row(s) hive> show create table bigint bigint bigint( hive> show create table bigdata_user; OK CREATE EXTERNAL TABLE `bigdata_user`( `id` int, `uid` string, `item_id` string, `behavior_type` int, `item_category` string, `visit_date` date, `province` string) COMMENT 'Welcome to xmu dblab!'ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' WITH SERDEPROPERTIES ( 'field.delim'='\t', 'serialization.format'='\t') STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'LOCATION 'hdfs://master:8020/bigdatacase/dataset'TBLPROPERTIES ( 'numFiles'='1', 'totalSize'='15590804', 'transient_lastDdlTime'='1528339771') Time taken: 0.316 seconds, Fetched: 24 row(s) hive> desc bigdata_user; OK id int uid string item_id string behavior_type int item_category string visit_date date province string Time taken: 0.124 seconds, Fetched: 7 row(s)1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
2、查看日志前10个交易日志的商品品牌
hive> select behavior_type from bigdata_user limit 10; OK111114111112345678910111213
3、如果要查出每位用户购买商品时的多种信息,输出语句格式为 select 列1,列2,….,列n from 表名;比如我们现在查询前20位用户购买商品时的时间和商品的种类
hive> select visit_date,item_category from bigdata_user limit 20; OK2014-12-08 40762014-12-12 55032014-12-12 55032014-12-02 97622014-12-12 52322014-12-02 97622014-12-12 55032014-12-12 108942014-12-12 65132014-12-12 108942014-12-12 28252014-11-28 28252014-12-15 32002014-12-03 105762014-11-20 105762014-12-13 105762014-12-08 105762014-12-14 70792014-12-02 66692014-12-12 5232Time taken: 0.713 seconds, Fetched: 20 row(s)123456789101112131415161718192021222324
4、有时我们在表中查询可以利用嵌套语句,如果列名太复杂可以设置该列的别名,以简化我们操作的难度,以下我们可以举个例子:
hive> select e.bh,e.it from (select behavior_type as bh,item_category as it from bigdata_user) as e limit 20; OK1 40761 55031 55031 97621 52324 97621 55031 108941 65131 108941 28251 28251 32001 105761 105761 105761 105761 70791 66691 5232Time taken: 0.547 seconds, Fetched: 20 row(s)123456789101112131415161718192021222324
5、用聚合函数count()计算出表内有多少条行数据
hive> select count(*) from bigdata_user;//用聚合函数count()计算出表内有多少条行数据 Total MapReduce CPU Time Spent: 0 msec OK300000Time taken: 6.418 seconds, Fetched: 1 row(s)12345
6.在函数内部加上distinct,查出uid不重复的数据有多少条
hive> select count(distinct uid) from bigdata_user;//在函数内部加上distinct,查出uid不重复的数据有多少条Total MapReduce CPU Time Spent: 0 msec OK270Time taken: 4.689 seconds, Fetched: 1 row(s)12345
7.询不重复的数据有多少条(为了排除客户刷单情况)
hive>select count(*) from (select uid,item_id,behavior_type,item_category,visit_date,province from bigdata_user group by uid,item_id,behavior_type,item_category,visit_date,province having count(*)=1)a; Total MapReduce CPU Time Spent: 0 msec OK284183Time taken: 16.05 seconds, Fetched: 1 row(s)12345
8.以关键字的存在区间为条件的查询
使用where可以缩小查询分析的范围和精确度,下面用实例来测试一下。
(1)查询2014年12月10日到2014年12月13日有多少人浏览了商品
select count(*) from bigdata_user where behavior_type='1' and visit_date <'2014-12-13' and visit_date>'2014-12-10';Total MapReduce CPU Time Spent: 0 msec OK 26329 Time taken: 3.058 seconds, Fetched: 1 row(s)123456
(2)以月的第n天为统计单位,依次显示第n天网站卖出去的商品的个数
select count(distinct uid),day(visit_date) from bigdata_user where behavior_type='4' group by day(visit_date);Total MapReduce CPU Time Spent: 0 msec OK 37 1 48 2 42 3 38 4 42 5 33 6 42 7 36 8 34 9 40 10 43 11 98 12 39 13 43 14 42 15 44 16 42 17 66 18 38 19 50 20 33 21 34 22 32 23 47 24 34 25 31 26 30 27 34 28 39 29 38 30 Time taken: 2.378 seconds, Fetched: 30 row(s)12345678910111213141516171819202122232425262728293031323334
(3)关键字赋予给定值为条件,对其他数据进行分析
取给定时间和给定地点,求当天发出到该地点的货物的数量
select count(*) from bigdata_user where visit_date='2014-12-12' and behavior_type='4' and province='江西';Total MapReduce CPU Time Spent: 0 msec OK 7 Time taken: 3.421 seconds, Fetched: 1 row(s)12345
9.根据用户行为分析
(1)查询一件商品在某天的购买比例或浏览比例
select count(*) from bigdata_user where visit_date='2014-12-11' and behavior_type='4';//查询有多少用户在2014-12-11购买了商品12
select count(*) from bigdata_user where visit_date='2014-12-11'//查询有多少用户在2014-12-11点击了该店12
两个相除得到某件商品购买率
(2)查询某个用户在某一天点击网站占该天所有点击行为的比例(点击行为包括浏览,加入购物车,收藏,购买)
select count(*) from bigdata_user where uid=10001082 and visit_date='2014-12-12';//查询用户10001082在2014-12-12点击网站的次数12
select count(*) from bigdata_user where visit_date='2014-12-12';1
两者相除
(3)给定购买商品的数量范围,查询某一天在该网站的购买该数量商品的用户id
select uid from bigdata_user where visit_date='2014-12-12' and behavior_type='4' group by uid having count(behavior_type='4')>5;1
(4)实时查询,某个地区的用户当天浏览网站的次数
create table scan(province string,scan int) comment 'This is the search of bigdataday' row format delimited fields terminated by '\t' stored as textfile;//创建新的数据表insert overwrite table scan select province ,count (behavior_type) from bigdata_user where behavior_type='1' group by province;//导入数据select * from scan;上海市 8364 云南 8454 内蒙古 8172 北京市 8258 台湾 8382 吉林 8272 四川 8359 天津市 8478 宁夏 8205 安徽 8205 山东 8236 山西 8503 广东 8228 广西 8358 新疆 8316 江苏 8226 江西 8403 河北 8363 河南 8382 浙江 8310 海南 8391 湖北 8183 湖南 8368 澳门 8264 甘肃 8415 福建 8270 西藏 8347 贵州 8505 辽宁 8292 重庆市 8506 陕西 8379 青海 8427 香港 8386 黑龙江 8309 Time taken: 0.248 seconds, Fetched: 34 row(s)1234567891011121314151617181920212223242526272829303132333435363738
10.创建临时表user_action
create table dblab.user_action(id string ,uid string,item_id string,behavior_type string,visit_date date,province string) comment 'Welcome to xmu dblab!' row format delimited fields terminated by '\t' stored as textfile; 1
11.这个命令执行完以后,Hive会自动在HDFS文件系统中创建对应的数据文件“/user/hive/warehouse/dblab.db/user_action”。
我们可以新建一个终端,执行命令查看一下,确认这个数据文件在HDFS中确实被创建了,请在新建的终端中执行下面命令:
./bin/hdfs dfs -ls /user/hive/warehouse/dblab.db/user_action-rwxr-xr-x 1 hadoop supergroup 15590786 2016-11-27 21:57 /user/hive/warehouse/dblab.db/user_action/000000_012
这说明,这个数据文件在HDFS中确实被创建了。注意,这个HDFS中的数据文件,在我们后面的“使用HBase Java API把数据从本地导入到HBase中”操作中会使用到。
12.将bigdata_user表中的数据插入到user_action(执行时间:10秒左右)
我们已经在Hive中的dblab数据库中创建了一个外部表bigdata_user,下面把dblab.bigdata_user数据插入到dblab.user_action表中,命令如下:
insert overwrite table dblab.user_action select * from dblab.bigdata_user;select * from user_action limit 10;12
三、使用sqoop将数据从Hive导入mysql
启动hadoop集群,Mysql服务
(1)登录mysql
[hadoop@master hadoop-2.7.3]$ mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2Server version: 5.1.73 Source distribution Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> 1234567891011
(2)创建数据库
mysql> create database dblab;mysql> show databases; +--------------------+| Database | +--------------------+| information_schema | | dblab | | hive | | mysql | +--------------------+ 4 rows in set (0.00 sec)mysql> use dblab; Database changed1234567891011121314
请使用下面命令查看数据库的编码:
mysql> show variables like 'character%'; +--------------------------+----------------------------+| Variable_name | Value | +--------------------------+----------------------------+| character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 || character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+8 rows in set (0.00 sec)123456789101112131415
(3)创建表
下面在MySQL的数据库dblab中创建一个新表user_action,并设置其编码为utf-8:
create table `dblab`.`user_action` (`id` varchar(50),`uid` varchar(50),`item_id` varchar(50),`behavior_type` varchar(10),`item_category` varchar(50),`visit_date` date,`province` varchar(20)) ENGINE=InnoDB DEFAULT CHARSET=utf-8;1
(4)导入数据(执行时间:20秒左右)
注意,刚才已经退出MySQL,回到了Shell命令提示符状态。下面就可以执行数据导入操作。
./bin/sqoop export --connect jdbc:mysql://localhost:3306/dblab --username root --password 123 --table user_action --export-dir '/user/hive/warehouse/dblab.db/user_action' --fields-terminated-by '\t';1
字段解释:
./bin/sqoop export ##表示数据从 hive 复制到 mysql 中
–connect jdbc:mysql://localhost:3306/dblab
–username root #mysql登陆用户名
–password hadoop #登录密码
–table user_action #mysql 中的表,即将被导入的表名称
–export-dir '/user/hive/warehouse/dblab.db/user_action ’ #hive 中被导出的文件
–fields-terminated-by '\t’ #Hive 中被导出的文件字段的分隔符
16/11/28 09:18:12 INFO mapreduce.Job: Job job_local1006738657_0001 completed successfully16/11/28 09:18:12 INFO mapreduce.Job: Counters: 20 File System Counters FILE: Number of bytes read=72216458 FILE: Number of bytes written=73973600 FILE: Number of read operations=0 FILE: Number of large read operations=0 FILE: Number of write operations=0 HDFS: Number of bytes read=38989562 HDFS: Number of bytes written=0 HDFS: Number of read operations=78 HDFS: Number of large read operations=0 HDFS: Number of write operations=0 Map-Reduce Framework Map input records=300000 Map output records=300000 Input split bytes=696 Spilled Records=0 Failed Shuffles=0 Merged Map outputs=0 GC time elapsed (ms)=145 Total committed heap usage (bytes)=511180800 File Input Format Counters Bytes Read=0 File Output Format Counters Bytes Written=016/11/28 09:18:12 INFO mapreduce.ExportJobBase: Transferred 37.1833 MB in 29.2772 seconds (1.27 MB/sec)16/11/28 09:18:12 INFO mapreduce.ExportJobBase: Exported 300000 records.12345678910111213141516171819202122232425262728
(4)查看MySQL中user_action表数据
mysql> select * from user_action limit 10;1
+--------+-----------+-----------+---------------+---------------+------------+-----------+| id | uid | item_id | behavior_type | item_category | visit_date | province | +--------+-----------+-----------+---------------+---------------+------------+-----------+| 225653 | 102865660 | 164310319 | 1 | 5027 | 2014-12-08 | 香港 | | 225654 | 102865660 | 72511722 | 1 | 1121 | 2014-12-13 | 天津市 | | 225655 | 102865660 | 334372932 | 1 | 5027 | 2014-11-30 | 江苏 | | 225656 | 102865660 | 323237439 | 1 | 5027 | 2014-12-02 | 广东 | | 225657 | 102865660 | 323237439 | 1 | 5027 | 2014-12-07 | 山西 | | 225658 | 102865660 | 34102362 | 1 | 1863 | 2014-12-13 | 内蒙古 | | 225659 | 102865660 | 373499226 | 1 | 12388 | 2014-11-26 | 湖北 | | 225660 | 102865660 | 271583890 | 1 | 5027 | 2014-12-06 | 山西 | | 225661 | 102865660 | 384764083 | 1 | 5399 | 2014-11-26 | 澳门 || 225662 | 102865660 | 139671483 | 1 | 5027 | 2014-12-03 | 广东 | +--------+-----------+-----------+---------------+---------------+------------+-----------+10 rows in set (0.00 sec)123456789101112131415
从Hive导入数据到MySQL中,成功!
四、使用Sqoop将数据从MySQL导入HBase
1、启动Hadoop集群、MySQL服务、HBase服务
start-hbase.sh1
start-shell1
2.创建表user_action
create 'user_action' ,{NAME=>'f1',VERSIONS=>5}1
HBase中创建了一个user_action表,这个表中有一个列族f1(你愿意把列族名称取为其他名称也可以,比如列族名称为userinfo),历史版本保留数量为5。
3.导入数据
import source destination
export destination source
./bin/sqoop import --connect jdbc:mysql://localhost:3306/dblab --username root --password 123 --table user_action --hbase-table user_action --column-family f1 --hbase-row-key id --hbase-create-table -m -11
注意:IP部分改为本机IP地址或localhost。同时,HBase只支持十六进制存储中文。
命令解释如下:
./bin/sqoop import –connect jdbc:mysql://localhost:3306/dblab
–username root
–password hadoop
–table user_action
–hbase-table user_action #HBase中表名称
–column-family f1 #列簇名称
–hbase-row-key id #HBase 行键
–hbase-create-table #是否在不存在情况下创建表
-m 1 #启动 Map 数量
执行上面的sqoop import命令以后,会得到类似下面的结果(省略了很多非重要的屏幕信息):
16/11/28 10:03:40 INFO mapreduce.Job: Counters: 20 File System Counters FILE: Number of bytes read=39428226 FILE: Number of bytes written=40095167 FILE: Number of read operations=0 FILE: Number of large read operations=0 FILE: Number of write operations=0 HDFS: Number of bytes read=0 HDFS: Number of bytes written=0 HDFS: Number of read operations=0 HDFS: Number of large read operations=0 HDFS: Number of write operations=0 Map-Reduce Framework Map input records=300000 Map output records=300000 Input split bytes=87 Spilled Records=0 Failed Shuffles=0 Merged Map outputs=0 GC time elapsed (ms)=1018 Total committed heap usage (bytes)=127795200 File Input Format Counters Bytes Read=0 File Output Format Counters Bytes Written=016/11/28 10:03:40 INFO mapreduce.ImportJobBase: Transferred 0 bytes in 69.7527 seconds (0 bytes/sec)16/11/28 10:03:40 INFO mapreduce.ImportJobBase: Retrieved 300000 records.123456789101112131415161718192021222324252627
4.查看HBase中user_action表数据
habse> scan 'user_action',{LIMIT=>10} #只查询前面10行1
1 column=f1:behavior_type, timestamp=1480298573684, value=1 1 column=f1:item_category, timestamp=1480298573684, value=4076 1 column=f1:item_id, timestamp=1480298573684, value=285259775 1 column=f1:province, timestamp=1480298573684, value=\xE5\xB9\xBF\xE4\xB8\x9C 1 column=f1:uid, timestamp=1480298573684, value=10001082 1 column=f1:visit_date, timestamp=1480298573684, value=2014-12-08 10 column=f1:behavior_type, timestamp=1480298573684, value=1 10 column=f1:item_category, timestamp=1480298573684, value=10894 10 column=f1:item_id, timestamp=1480298573684, value=323339743 10 column=f1:province, timestamp=1480298573684, value=\xE5\xB1\xB1\xE4\xB8\x9C 10 column=f1:uid, timestamp=1480298573684, value=10001082 10 column=f1:visit_date, timestamp=1480298573684, value=2014-12-12 100 column=f1:behavior_type, timestamp=1480298573684, value=1 100 column=f1:item_category, timestamp=1480298573684, value=10576 100 column=f1:item_id, timestamp=1480298573684, value=275221686 100 column=f1:province, timestamp=1480298573684, value=\xE6\xB9\x96\xE5\x8C\x97 100 column=f1:uid, timestamp=1480298573684, value=10001082 100 column=f1:visit_date, timestamp=1480298573684, value=2014-12-02 1000 column=f1:behavior_type, timestamp=1480298573684, value=1 1000 column=f1:item_category, timestamp=1480298573684, value=3381 1000 column=f1:item_id, timestamp=1480298573684, value=168463559 1000 column=f1:province, timestamp=1480298573684, value=\xE5\xB1\xB1\xE8\xA5\xBF 1000 column=f1:uid, timestamp=1480298573684, value=100068031 1000 column=f1:visit_date, timestamp=1480298573684, value=2014-12-02 10000 column=f1:behavior_type, timestamp=1480298575888, value=1 10000 column=f1:item_category, timestamp=1480298575888, value=12488 10000 column=f1:item_id, timestamp=1480298575888, value=45571867 10000 column=f1:province, timestamp=1480298575888, value=\xE6\xB9\x96\xE5\x8C\x97 10000 column=f1:uid, timestamp=1480298575888, value=100198255 10000 column=f1:visit_date, timestamp=1480298575888, value=2014-12-05 100000 column=f1:behavior_type, timestamp=1480298594850, value=1 100000 column=f1:item_category, timestamp=1480298594850, value=6580 100000 column=f1:item_id, timestamp=1480298594850, value=78973192 100000 column=f1:province, timestamp=1480298594850, value=\xE5\xB1\xB1\xE4\xB8\x9C 100000 column=f1:uid, timestamp=1480298594850, value=101480065 100000 column=f1:visit_date, timestamp=1480298594850, value=2014-11-29 100001 column=f1:behavior_type, timestamp=1480298594850, value=1 100001 column=f1:item_category, timestamp=1480298594850, value=3472 100001 column=f1:item_id, timestamp=1480298594850, value=34929314 100001 column=f1:province, timestamp=1480298594850, value=\xE5\x8C\x97\xE4\xBA\xAC\xE5\xB8\x82 100001 column=f1:uid, timestamp=1480298594850, value=101480065 100001 column=f1:visit_date, timestamp=1480298594850, value=2014-12-15 100002 column=f1:behavior_type, timestamp=1480298594850, value=1 100002 column=f1:item_category, timestamp=1480298594850, value=10392 100002 column=f1:item_id, timestamp=1480298594850, value=401104894 100002 column=f1:province, timestamp=1480298594850, value=\xE6\xB1\x9F\xE8\xA5\xBF 100002 column=f1:uid, timestamp=1480298594850, value=101480065 100002 column=f1:visit_date, timestamp=1480298594850, value=2014-11-29 100003 column=f1:behavior_type, timestamp=1480298594850, value=1 100003 column=f1:item_category, timestamp=1480298594850, value=5894 100003 column=f1:item_id, timestamp=1480298594850, value=217913901 100003 column=f1:province, timestamp=1480298594850, value=\xE9\xBB\x91\xE9\xBE\x99\xE6\xB1\x9F 100003 column=f1:uid, timestamp=1480298594850, value=101480065 100003 column=f1:visit_date, timestamp=1480298594850, value=2014-12-04 100004 column=f1:behavior_type, timestamp=1480298594850, value=1 100004 column=f1:item_category, timestamp=1480298594850, value=12189 100004 column=f1:item_id, timestamp=1480298594850, value=295053167 100004 column=f1:province, timestamp=1480298594850, value=\xE6\xB5\xB7\xE5\x8D\x97 100004 column=f1:uid, timestamp=1480298594850, value=101480065 100004 column=f1:visit_date, timestamp=1480298594850, value=2014-11-26 10 row(s) in 2.1550 seconds12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
五、使用HBase Java API把数据从本地导入到HBase中
1、数据准备 实际上,我们也可以编写Java程序,直接从HDFS中读取数据加载到HBase。但是,这里我们展示的是如何用JAVA程序把本地数据导入到HBase中。你只要把程序做简单修改,就可以实现从HDFS中读取数据加载到HBase。
首先,请将之前的user_action数据从HDFS复制到Linux系统的本地文件系统中,命令如下:
cd /app/appJar/dataset hdfs dfs -get /user/hive/warehouse/dblab.db/user_action . #将HDFS上的user_action数据复制到本地当前目录,注意'.'表示当前目录cat ./user_action/* | head -10 #查看前10行数据cat ./user_action/part-00000* >user_action.output > user_action.output #将part-00000*文件复制一份重命名为user_action.output,*表示通配符head user_action.output #查看user_action.output前10行1234567
2、编写数据导入程序
编写Java程序实现HBase数据导入功能
编写ImportHBase程序,并打包成可执行jar包,命名为ImportHBase.jar。
然后,请在“/home/bduser/guoyg/”目录下面新建一个appJar子目录,用来存放ImportHBase.jar。
drwxr-xr-x 2 bduser bduser 6 6月 19 14:36 appJar drwxrwxr-x 3 bduser bduser 143 6月 19 14:32 dataset123
3、数据导入
现在开始执行数据导入操作。
使用Java程序将数据从本地导入HBase中,导入前,请先清空user_action表。
请在之前已经打开的HBase Shell窗口中(也就是在“hbase>”命令提示符下)执行下面操作:
hbase> truncate 'user_action'Truncating 'user_action' table (it may take a while): - Disabling table... - Truncating table...0 row(s) in 4.0120 seconds//删除以后再查看就没有记录了hbase> scan 'user_action',{LIMIT=>10} ROW COLUMN+CELL 0 row(s) in 0.4010 seconds123456789
运行hadoop jar程序
hadoop jar /home/bduser/guoyg/appJar/ImportHBase.jar HBaseImportTest /home/bduser/guoyg/dataset/user_action.output1
这个命令大概会执行3分钟左右,执行过程中,屏幕上会打印出执行进度,每执行1万条,对打印出一行信息,所以,整个执行过程屏幕上显示如下信息:
100002000030000400005000060000700008000090000100000110000120000130000140000150000160000170000180000190000200000210000220000230000240000250000260000270000280000290000300000Total Time: 259001 ms12345678910111213141516171819202122232425262728293031
4、查看HBase中user_action表数据
hbase>scan 'user_action',{LIMIT=>10}1
1 column=f1:behavior_type, timestamp=1480298573684, value=1 1 column=f1:item_category, timestamp=1480298573684, value=4076 1 column=f1:item_id, timestamp=1480298573684, value=285259775 1 column=f1:province, timestamp=1480298573684, value=\xE5\xB9\xBF\xE4\xB8\x9C 1 column=f1:uid, timestamp=1480298573684, value=10001082 1 column=f1:visit_date, timestamp=1480298573684, value=2014-12-08 10 column=f1:behavior_type, timestamp=1480298573684, value=1 10 column=f1:item_category, timestamp=1480298573684, value=10894 10 column=f1:item_id, timestamp=1480298573684, value=323339743 10 column=f1:province, timestamp=1480298573684, value=\xE5\xB1\xB1\xE4\xB8\x9C 10 column=f1:uid, timestamp=1480298573684, value=10001082 10 column=f1:visit_date, timestamp=1480298573684, value=2014-12-12 100 column=f1:behavior_type, timestamp=1480298573684, value=1 100 column=f1:item_category, timestamp=1480298573684, value=10576 100 column=f1:item_id, timestamp=1480298573684, value=275221686 100 column=f1:province, timestamp=1480298573684, value=\xE6\xB9\x96\xE5\x8C\x97 100 column=f1:uid, timestamp=1480298573684, value=10001082 100 column=f1:visit_date, timestamp=1480298573684, value=2014-12-02 1000 column=f1:behavior_type, timestamp=1480298573684, value=1 1000 column=f1:item_category, timestamp=1480298573684, value=3381 1000 column=f1:item_id, timestamp=1480298573684, value=168463559 1000 column=f1:province, timestamp=1480298573684, value=\xE5\xB1\xB1\xE8\xA5\xBF 1000 column=f1:uid, timestamp=1480298573684, value=100068031 1000 column=f1:visit_date, timestamp=1480298573684, value=2014-12-02 10000 column=f1:behavior_type, timestamp=1480298575888, value=1 10000 column=f1:item_category, timestamp=1480298575888, value=12488 10000 column=f1:item_id, timestamp=1480298575888, value=45571867 10000 column=f1:province, timestamp=1480298575888, value=\xE6\xB9\x96\xE5\x8C\x97 10000 column=f1:uid, timestamp=1480298575888, value=100198255 10000 column=f1:visit_date, timestamp=1480298575888, value=2014-12-05 100000 column=f1:behavior_type, timestamp=1480298594850, value=1 100000 column=f1:item_category, timestamp=1480298594850, value=6580 100000 column=f1:item_id, timestamp=1480298594850, value=78973192 100000 column=f1:province, timestamp=1480298594850, value=\xE5\xB1\xB1\xE4\xB8\x9C 100000 column=f1:uid, timestamp=1480298594850, value=101480065 100000 column=f1:visit_date, timestamp=1480298594850, value=2014-11-29 100001 column=f1:behavior_type, timestamp=1480298594850, value=1 100001 column=f1:item_category, timestamp=1480298594850, value=3472 100001 column=f1:item_id, timestamp=1480298594850, value=34929314 100001 column=f1:province, timestamp=1480298594850, value=\xE5\x8C\x97\xE4\xBA\xAC\xE5\xB8\x82 100001 column=f1:uid, timestamp=1480298594850, value=101480065 100001 column=f1:visit_date, timestamp=1480298594850, value=2014-12-15 100002 column=f1:behavior_type, timestamp=1480298594850, value=1 100002 column=f1:item_category, timestamp=1480298594850, value=10392 100002 column=f1:item_id, timestamp=1480298594850, value=401104894 100002 column=f1:province, timestamp=1480298594850, value=\xE6\xB1\x9F\xE8\xA5\xBF 100002 column=f1:uid, timestamp=1480298594850, value=101480065 100002 column=f1:visit_date, timestamp=1480298594850, value=2014-11-29 100003 column=f1:behavior_type, timestamp=1480298594850, value=1 100003 column=f1:item_category, timestamp=1480298594850, value=5894 100003 column=f1:item_id, timestamp=1480298594850, value=217913901 100003 column=f1:province, timestamp=1480298594850, value=\xE9\xBB\x91\xE9\xBE\x99\xE6\xB1\x9F 100003 column=f1:uid, timestamp=1480298594850, value=101480065 100003 column=f1:visit_date, timestamp=1480298594850, value=2014-12-04 100004 column=f1:behavior_type, timestamp=1480298594850, value=1 100004 column=f1:item_category, timestamp=1480298594850, value=12189 100004 column=f1:item_id, timestamp=1480298594850, value=295053167 100004 column=f1:province, timestamp=1480298594850, value=\xE6\xB5\xB7\xE5\x8D\x97 100004 column=f1:uid, timestamp=1480298594850, value=101480065 100004 column=f1:visit_date, timestamp=1480298594850, value=2014-11-26 10 row(s) in 0.6380 seconds12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
至此使用Hive进行ETL结束。