标识符规则
大小写规则:
1. hive的数据库名、表名都不区分大小写
2. 建议关键字大写
命名规则:
1. 名字不能使用数字开头
2. 不能使用关键字
3. 尽量不使用特殊符号
操作数据库
--创建数据库
hive> create database db01;
--先判断数据库是否存在再创建
hive> create database if not exists db02;
--判断数据库并在创建数据库时添加注释
hive> create database if not exists db03 comment 'this is a database of laoyan';hive默认元数据是放在mysql数据库中的,但是mysql数据库在刚开始的时候是不支持中文的,hive的元数据的数据库名字叫hive,创建该数据库的时候使用的字符集是latin 字符,不支持中文。
不信的话,创建一个带有中文解释的数据库:
create database if not exists db02 comment "大数据"
创建hive数据库之后,在你的hdfs上会多一个文件夹:
而且在mysql的元数据库,可以查看数据
查看所有数据库:
show databases;切换数据库:
use db01; use default;查看数据库结构:
语法1:desc database databaseName; 语法2:desc database extended databaseName; 语法3:describe database extended databaseName; 这三个语句的展示效果一样删除数据库:
语法1:drop database databasename; # 这个只能删除空库 语法2:drop database databasename cascade; # 如果不是空库,则可以加cascade强制删除操作表
关于数据类型
Hive的数据类型分为基本数据类型和复杂数据类型,下面是基本数据类型:
只需要简单的记忆几个即可:
INT ,STRING
因为varchar可以存储的字段长度有限,String可以存储高达2G的字符串长度,而且是可变长度的。
create table stu(name varchar(20));
create table stu(name string);
创建表
语法1:使用库.表的形式
create table db03.t_user(id int,name string);语法2:指定分隔规则形式
create table db03.t_user2(
id int,
name string,
age int,
height double
)
comment "这是一个学生表"
row format delimited
fields terminated by '\t'
lines terminated by '\n'
stored as textfile;
LINES TERMINATED BY '\n'可以不写,默认就是换行符\n,写上只是显式声明,不写行为一致;
STORED AS TEXTFILE;建议加上,虽然 Hive 默认存储格式也是 TEXTFILE,但规范建表语句建议显式指定,可读性更好,后续切换格式也一目了然。
查看你当前在哪个数据库下面:
hive> select current_database();
OK
db02切换数据库:use db03;
查看所有表:
show tables;
-- 实战:创建一个emp表
create table if not exists db03.emp( eno int, ename string, job string, mgr int ) row format delimited fields terminated by ',' lines terminated by '\n' stored as textfile;创建完一个表之后,在你的hdfs上多了一个文件夹:
查看mysql中的元数据:
查看表结构:
desc tableName desc extended tableName; describe extended tableName;删除表
drop table 表的名字;Hive中 本地模式的开启
以下这个配置是使用本地资源跑MR任务: set hive.exec.mode.local.auto=true; set hive.exec.mode.local.auto.inputbytes.max=134217728; set hive.exec.mode.local.auto.input.files.max=4;需要在console中,输入以下命令设置本地模式,只对本窗口有效果
假如遇到运行失败的语句,记得查看日志:/opt/installs/hive/logs/hive.log 文件。
比如我们刚才执行insert into,就报错了
遇到这个错,要么设置启用本地模式:
set hive.exec.mode.local.auto=true; set hive.exec.mode.local.auto.inputbytes.max=134217728; set hive.exec.mode.local.auto.input.files.max=4;要么在hadoop的yarn-site.xml中,添加如下配置:
<property> <name>yarn.scheduler.minimum-allocation-mb</name> <value>2048</value> <description>default value is 1024</description> </property>重启 yarn 即可:
stop-yarn.sh
start-yarn.sh
加载数据
加载本地数据
创建一个文件夹,将来把所有的数据,都放在这个文件下:
mkdir /home/hivedata
创建一个文件
vim user.txt
添加如下数据:
1,宝总
2,李李
3,小汪
4,爷叔
先有数据,根据数据的格式,和字段数量以及类型,创建一个表:
create table db03.t_user( id int, name string ) row format delimited fields terminated by ',' lines terminated by '\n' stored as textfile;加载本地数据:
load data local inpath "/home/hivedata/user.txt" into table db03.t_user;同时在HDFS上也能看到对应的数据文件,你能够看到里面的数据,并且没有乱码,原因是stored as textfile。
从HDFS加载到Hive中
hdfs dfs -put /home/hivedata/user.txt /home将hdfs的数据导入到t_user 表中:就比之前少了一个 local 关键字
load data inpath '/home/user.txt' into table db03.t_user;然后可以看到表中的数据了
查看hdfs上的user.txt 发现不见了,去哪里了,被移动走了!
思考一下:为什么是移动,而不是复制?
因为hdfs上的数据,默认都以为比较大,所以如果相同的数据占2份,非常的消耗空间。
查看数据,发现有两份,想覆盖怎么办?
load data local inpath '/home/hivedata/user.txt' overwrite into table db03.t_user;覆盖之后数据如下:
文件也覆盖了
将数据直接放入表对应的文件夹下
再思考一个问题:既然hive中的数据是在hdfs上的,我们也可以手动的上传数据,能上传至/home,为何不能上传至:/user/hive/warehouse/db03.db/t_user
cp user.txt user2.txt hdfs dfs -put /home/hivedata/user2.txt /user/hive/warehouse/db03.db/t_user可以看到hive中的数据,不要load 也可以被正常使用。
从其他表中加载数据
insert into table tableName2 select [.....] from tableName1; 扩展内容:向多张表中插入数据的语法 from tableName1 insert into tableName2 select * where 条件 insert into tableName3 select * where 条件快速创建一个同样的表,只要表结构: create table db03.t_user2 like db03.t_user; 创建完之后再运行 insert into table db03.t_user2 select * from db03.t_user; 创建t_user3和 4 create table db03.t_user5 like db03.t_user; create table db03.t_user4 like db03.t_user; from db03.t_user2 insert into db03.t_user4 select * insert into db03.t_user5 select id,name;克隆表数据
复制表结构 create table if not exists db03.t_user6 like db03.t_user2; 复制表结构和数据 create table if not exists db03.t_user7 as select * from db03.t_user2;通过hive进行流量统计
这是数据文件,数据用空格符隔开
根据数据结构,创建表结构:
CREATE TABLE db03.flow( id string , phonenumber string, mac string, ip string, url string, uppacket int, downpacket int, upflow int, downflow int, status int, issuccess int )ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ';FIELDS TERMINATED BY ' '; 代表存储的数据之间的分隔符
加载本地数据
load data local inpath '/home/hivedata/HTTP_flow.dat' into table db03.flow;可以看到数据成功插入
需求:统计每一个手机号码的上行和下行流量以及总流量。
想在 hivesql 中给字典起别名,使用 反引号 将 字段名引起来。 ``
select phonenumber, sum(upflow) as `上行流量` , sum(downflow) as `下行流量`, sum(upflow+downflow) as `总流量` from db03.flow group by phonenumber;