1.一定要考虑yum源,把它换成本地的,网络问题(公司有多个人都下载很大的文件时就有问题了),软件版本问题,都是事!
2.分区可以按时间,每个月,每一天的数据放在一起!
3.注意分区字段不能和表中的字段重复,否则报错!
4.加载数据用load data local ..(当建表的时候有了分区,则加载数据的时候也需要指定分区,否则就会出错!),在HDFS中是根据分区来创建文件夹存储的,管理的!
5.添加分区是用alter命令,只是对元数据操作!
6.删除分区的时候可能会丢失数据哦,注意(如果表是内部表)!
7.指定分区为多个的时候,当加载数据的时候也要将多个分区都指定,因为在HDFS上数据分区是一级一级的存储的,创建表的时候给定分区的顺序是有意义的,因为是一级目录,二级目录!
8.当指定多个分区的时候,删除分区的时候要特别注意;不能直接将一级目录给删除哦(删除分区的时候),否则数据真的都会删除的!
9.我们做的是离线数据处理,数据量还是挺大的,所以我们一般做日志数据分区的时候,一般都是会分区的(可以按年,月,日,时进行分区),分区便于数据管理(管理某个分区内的数据),和数据分析(只分析某一个分区内(某个时间段)的数据)!
10.插入数据:(通过这种方式将分析的数据放在结果表中)
create table like
from psn1
insert into table psn7
select id ,name , address;
也可以用:
insert into table psn7
select id ,name , address from psn1;
11.一般都不会直接用insert into table tb01 values()这种方式往数据表中插入数据,这种HQL都会转换成MapReduce,这种效率太慢!
12.所以加载数据就两种方式:1.load data ... 2.insert into table psn7 select id ,name , address from psn1;这两种方式!
13.Truncate Table 用于清空数据!
10.当数据在HDFS上的时候,当我们加载HDFS上的数据到我们的表中的时候,HDFS上的数据会消失!(移动)
但是当数据是在本地的时候,本地上的数据就不会丢失,将文件上传到HDFS,将上传的HDFS文件移动到我们自己创建的数据表下的分区下,当多次load同一份数据的时候,在HDFS上是不会覆盖的!
11.hive2提供了一种jdbc连接的方式!
第一种连接: beeline的命令都是以!开头!hive的默认是不开启用户名和密码的验证的!
服务端:hiveserver2
客户端:beeline
!connect jdbc:hive2://node03:10000
用户名:root
密码随便输入
netstat -gpnl | grep java
beeline最大的优势是允许我们以jdbc的方式连接hive 服务端!
第二种连接:beeline -u jdbc:hive2://node03:10000 -n root(-n指定用户名)
12.jdbc连接走的是Thrift协议!
13.先用MapReduce--不要用普通的java代码,跑不起来,而且MapReduce是多线程的(因为是海量数据)为日志文件进行ETL清洗(数据清洗),然后将
数据采集(爬虫)+数据清洗最终目的就是用于数据分析!
14.^在中括号内核中括号外的区别?
[^0-3],表示找到这一个位置上的字符只能是除了0到3之外的所有字符!
^如果在中括号之外,表示^是以什么什么开头!
16.row format定义的是序列化和反序列化:它不对源文件修改,只是在读和写的时候进行过滤!
17.Hive能简化MapReduce操作,很大一部分要归功于它自带的函数(内置函数很丰富,功能也很强大)以及可以自定义函数!
18.Hive中的自定义函数中的数据类型不能和java一样,要和MapReduce中的一样!
19.自定义的jar包上传到hive客户端所在服务器上,然后用命令加入(因为是在hive客户端执行add jar 本地目录)!
总结:
1.HIVE是作为数据仓库而不是数据库哦!
2.hive架构:元数据存储,关系型数据mysql!
3.hive是将HQL解析为MR,来简化MapReduce分析!
4.hive的三种部署方式: hive--->metastoreServer----->mysql
hiveSQL 数据类型 复杂类型
5.内部表与外部表的区别:
create table tb01 like ..
create table tb01 as select ...
6.分区
7.DML: (导入数据)
1.load data...
2.from tab01
insert into tb02
select ...... 分析语句!
8.select * 有的时候是不会转换成MapReduce程序的!
9.beeline和原来的设置是没区别的,它是hive2自带的,beeline的优势是允许我们用jdbc代码来操作HIVE!
10.函数:
1)HIVE内置函数:
2)用户自定义函数:
UDF
UDAF
UDTF
11.用户自定义函数:脱敏!!!
====================================作业========================================
20.作业:业务需求:分析基站掉话率就是看看信号好不好,然后是否需要建基站!
思路: 用Hive HQL实现!
创建两者表:用insert into select from ... order by
一张是建表的语句,一张是数据的分析!
将HQL以及执行结果都总结下来!
作业:
1、基站掉话率:找出掉线率最高的前10基站
record_time:通话时间
imei:基站编号
cell:手机编号
drop_num:掉话的秒数
duration:通话持续总秒数
原表:
DROP TABLE IF EXISTS basestation;
CREATE EXTERNAL TABLE IF NOT EXISTS default.basestation(
record_time string COMMENT '通话时间',
imei string COMMENT '基站编号',
cell string COMMENT '手机编号',
ph_num string,
call_num string,
drop_num int COMMENT '掉话的秒数',
duration int COMMENT '通话持续总秒数',
drop_rate double,
net_type string,
erl string
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',';
load data local inpath '/root/data' OVERWRITE into table basestation;
创建一张字段少的中间表:
create table station
as select imei,drop_num,duration from basestation;
保存结果:
DROP TABLE IF EXISTS result;
create TABLE IF NOT EXISTS default.result
as select imei,sum(drop_num/duration) as hi from station
where duration !=0 and drop_num != 0
group by imei
order by hi desc
limit 10;
执行结果:
357671 0.14548412399367863
355747 0.1111111111111111
353522 0.10251725470084835
354132 0.1008605851979346
351761 0.08631818640415001
355383 0.07833150166557866
358302 0.07692307692307693
356997 0.0719873460702282
353070 0.07164183651707644
863863 0.06705675833820948