说明:通过案例来温故下用到的知识点。
案例:
数据准备:ip7.json
{"id":188,"ip":"112.168.10.129","domain":"www.baidu.com","port":80} {"id":267,"ip":"132.158.140.119","domain":"www.baidu1.com","port":807} {"id":3445,"ip":"112.168.10.129","domain":"www.alibaba.com","port":805} {"id":4535,"ip":"132.158.120.119","domain":"www.baidu1.com","port":840} {"id":14534,"ip":"102.118.10.129","domain":"www.360.com","port":8060} {"id":22332,"ip":"12.8.140.119","domain":"www.sina.com","port":8080}
题目:将符合要求的数据通过hive放入hbase
1、将数据放入临时表ip7_temp中 -- 注:温故下如何将json数据放入临时表中,用到官方json包
2、将id>3445的记录放入hbase的表hive2hbase1中 -- 注:温故一下 hive与hbase的整合知识点(或者hbase与hive整合)
3、将记录按照ip地址的网段分组并显示访问条数,例如: -- 注:温故一下 hbase与hive的整合知识点
id ip total 1 124.34.34.56 3 2 124.34.34.53 3 3 124.34.34.52 3 4 125.32.34.56 2 5 125.32.34.56 2
同时将数据存入hbase的hive2hbase2表中。
解答:
#1、将数据放入临时表ip7_temp中
1、建表
create table if not exists ip7_temp( id int, ip string, domain string, port int ) row format serde "org.openx.data.jsonserde.JsonSerDe";
2、加载数据
load data local inpath 'hivedata/ip7.json' into table ip7_temp;
#2、将id>3445的记录放入hbase的表hive2hbase1中
1、创建个数据库
create database hive2hbase;
2、使用该数据库,将表、数据都放到此数据库中
use hive2hbase;
3、在hive中建表与hbase整合 -- 注:在hive中加载数据不能使用load,故使用insert into
create table if not exists hive2hbase ( id int, ip string, domain string, port int ) stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with serdeproperties( "hbase.columns.mapping"=":key,base_info:ip,base_info:domain,base_info:port" ) tblproperties( "hbase.table.name"="hive2hbase1" );
4、将数据加载到hbase中 -- 注:在hive中加载数据不能使用load,故使用insert into
insert into hive2hbase select * from ip7_temp where id >3445;
#3、将记录按照ip地址的网段分组并显示访问条数 -- 利用hbase与hive整合
第一步:
- 在hbase中建表
#新建命名空间 create_namespace 'hivehbasedemo' #建表 create 'hivebasedemo:hbase2hive2','base_info' #查询表结构 describe 'hivehbasedemo:hbase2hive2'
- 然后在hive中建表
create external table if not exists hbase2hive2 ( id int, ip string, domain string, port int ) stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with serdeproperties( "hbase.columns.mapping"=":key,base_info:ip,base_info:domain,base_info:port" ) tblproperties( "hbase.table.name"="hivehbasedemo:hbase2hive2" );
第二步:
- 在idea中使用java自定义函数来获取ip的前三位 -- 因为系统内置函数当中没有符合要求的
package com.qf.hive; import org.apache.hadoop.hive.ql.exec.UDF; public class GetSubStr extends UDF { public String evaluate(String str){ return str.substring(0,str.lastIndexOf(".")); } }
- 将自定义的jar包 上传到 服务器,做好准备工作后,先检测一下是否成功
select id,ip,count(*) over(partition by(substr(ip))) from ip7_temp;
- 按要求分组后的数据加载到hbase中
insert into hive2hbase2 select id,ip,count(*) over(partition by(substr(ip))) total from ip7_temp;