HIVE从入门到精通------(1)hive的基本操作
1.开启hive
1.首先在master的/usr/local/soft/下启动hadoop: master : start-all.sh
start-all.sh
2.在另一个master(2)上监控hive日志: master(2): tail -F /tmp/root/hive.log
tail -F /tmp/root/hive.log
3.在master上启动元数据服务: master: nohup hive --service metastore &
nohup hive --service metastore &
4.用服务端在启动hiveserver2服务: master: nohup hiveserver2 &
nohup hiveserver2 &
5.在node1中开启服务端: node1: beeline -u jdbc:hive2://master:10000 -n root
beeline -u jdbc:hive2://master:10000 -n root
2.上传数据到hdfs
1.在hive中,将linux中创建本地文件上传至hdfs
1.首先在hive中移动到数据库,在指定的数据库下面创建表:
hive:
create table ........;
2.在master中移动到本地数据库,在该数据库下面创建本地文件,在文件内导入数据:
master:
cd /usr/local/soft/bigdata30/ //linux上的路径
vim a.txt
3.在hive中,将linux的txt文件导入到hdfs:
hive:
//inpath路径是linux上的路径,是上传数据,操作过后linux本地的数据不会消失
load data local inpath '/usr/local/soft/bigdata30/a.txt' into table a;
2.在hive中,将hdfs上面文件移动到hive表中
1.首先在hive中移动到数据库,在指定的数据库下面创建表:
hive:
create table ........;
2.通过某些任务会在hdfs上面产生数据,将hdfs上的/input1目录下的数据移动至students表对应的hdfs目录下:
hive:
//这个命令是移动数据,操作过后原位置inpath上的数据将不存在,inpath上的路径是hdfs数据目录的路径
load data inpath '/input1/students.txt' into table students;
3.当反复多次执行上传数据命令在相同路径,会产生copy文件:
//以追加的形式
再次执行,load data inpath '/input1/students.txt' into table students;
在students文件的目录下面将存在:
students.txt students_copy_1.txt
4.以覆盖的形式
load data inpath '/input1/students.txt' overwrite into table students;
3.在hive中,将已存在的表中插入自己写的sql语句
1.首先在hive中移动到数据库,在指定的数据库下面创建表students2:
hive:
create table ........;
2.将对students表进行sql操作过后的指定数据插入到空表students2中,这是复制原表数据还在
insert into table students2 select * from students;
多次执行会追加数据
3.覆盖插入
insert overwrite table students2 select * from students;
4.模板
insert overwrite table xxx.xxx partition(xxx=${xxx})
select
xxx from xxx;
4.在linux中,将本地数据传入到hdfs
1.首先在hive中移动到数据库,在指定的数据库下面创建表:
hive:
create table ........;
2.在master中移动到本地数据库,在该数据库下面将文件从Windows里面拖入:
master:
cd /usr/local/soft/bigdata30/ //linux上的路径
或vim.....
3.在master中,将linux的txt文件导入到hdfs:
master:
hadoop fs -put '本地数据' 'hive表对应的HDFS目录下'
hadoop fs -put students.txt /user/hive warehouse/bigdata30.db/students/
3.hive导出数据
1.将查询结果存放到本地
1.在master创建目录:
mkdir -p /usr/local/soft/bigdata30/hive_out1
2.在hive中将查询的数据导出到linux的目录里面:
//在本地地址下面,其中的/person_data是不存在的,在/usr/local/soft/bigdata30/hive_out1下面没有这个,是用来存放hdfs导出数据的文件夹
**insert overwrite local directory '/usr/local/soft/bigdata30/hive_out1/person_data' **
select * from students;
3.可以在导出数据的时候对数据的格式进行处理:
insert overwrite local directory '/usr/local/soft/bigdata30/hiveout1'
ROW FORMAT DELIMITED fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
lines terminated by '\n'
select * from students2;
4.库操作
1.创建数据库
1.创建一个数据库,数据库在HDFS上的默认存储路径是/hive/warehouse/.db。 这个是default库,没指定库进行创建的话就会直接在该目录下进行创建。
create database 库名;
2.避免已经存在的错误
create database [if not exists] 库名;
3.指定位置创建数据库
在指定的位置下面创建数据库,这个路径上的库名和指定创建的库名不一定要相同,只是作为映射关系
create database if not exists
库名 location '/bigdata30/db';
如果是:CREATE DATABASE IF NOT EXISTS aaa LOCATION '/user/hive/warehouse/bbb';
aaa 的路径: hdfs://master:9000/user/hive/warehouse/bbb
4.修改数据库
不可改动:
数据库名称:一旦创建了数据库,数据库的名称是不可更改的。
数据库的位置:数据库在Hive中的存储位置是指定创建时就确定的,无法后期修改。
数据库的所有者:一旦创建了数据库,数据库的所有者也是不可更改的。
alter database 库名 set dbproperties('createtime'='20240612');
5.数据库详细信息
1.显示数据库
show databases;
2.通过like进行过滤
show databases like 'students*';
3.查看详情信息
desc databases 库名;
6.切换数据库
use 库名;
7.删除数据库
1.直接删除没有表的库
drop database 库名;
2.删除有表的库
drop database if exists 库名 cascade;
3.避免不存在错误
drop database if exists 库名;
5.表操作
1.默认建表
create table 表名
(
id bigint,
name string,
age int,
gender string,
clazz string
)
row format delimited fields terminated by ','; //必选,指定分隔符
(传入的数据要和建表时侯指定的分隔符相同)
2.指定location建表
1.如果创建一张表,未指定位置,那么其会指定在/user/hive/warehouse/bigdata30.db下面创建,再hdfs上面可以看见所创建的表名。
2.如果指定位置进行创建,但是位置最后没有包含表名,再hdfs上看不到所对应的表名。
指定位置创建对应的表的时候在指定的位置最后要带上所创建的表名。
create table IF NOT EXISTS students2
(
id bigint,
name string,
age int,
gender string,
clazz string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/bigdata30/students2'; // 指定Hive表的数据的存储位置,一般在数据已经上传到HDFS,想要直接使用,会指定Location,通常Locaion会跟外部表一起使用,内部表一般使用默认的location
3.指定存储格式
create table if not exists 表名
(
id bigint,
name string
)
row format delimited fields terminated by ','
stored as orc //指定存储格式为orc
location '/bigdata30/out6';
如果不指定,默认为textfile,注意:除textfile以外,其他的存储格式的数据都不能直接加载,需要使用从表加载的方式。
4.将查询结果创建为一个新表
创建一张表 ,将某个语句所查询到的数据进行储存,专门用来存储查询语句的表
CREATE TABLE 新表名 AS SELECT 查询语句;
CREATE TABLE adult_students AS
SELECT * FROM students
WHERE age >= 18;
这个语句的含义是,从students
表格中选择所有年龄大于等于18岁的学生信息,并将结果存储到名为adult_students
的新表格中。
5.模仿已存在表的格式创建不带数据的相同格式的表
这个语法是在数据库中创建一个新表,但是不会复制数据,只会复制表结构,模仿另一张表的形式创建新表格。它的形式是:
CREATE TABLE 新表名 LIKE 要模仿的表名;
举个例子,假设我们有一个名为employees
的表格,其中包含员工的姓名、工号、部门等信息。我们想要创建一个结构与employees
相同但不含数据的新表格employees_backup
,可以执行以下语句:
CREATE TABLE employees_backup LIKE employees;
简单用户信息表创建:
create table t_user( id int, uname string, pwd string, gender string, age int ) row format delimited fields terminated by ',' lines terminated by '\n'; //满一行就换行
1,admin,123456,男,18 2,zhangsan,abc123,男,23 3,lisi,654321,女,16
复杂人员信息表创建:
create table IF NOT EXISTS t_person( name string, friends array<string>, children map<string,int>, address struct<street:string ,city:string> ) row format delimited fields terminated by ',' -- 列与列之间的分隔符 collection items terminated by '_' -- 元素与元素之间分隔符 map keys terminated by ':' -- Map数据类型键与值之间的分隔符 lines terminated by '\n'; -- 行与行之间的换行符
songsong,bingbing_lili,xiao song:18_xiaoxiao song:19,beng bu_anhui yangyang,caicai_susu,xiao yang:18_xiaoxiao yang:19,he fei_anhui
6.表详细信息
show tables;
show tables like 'u*';
desc t_person;
desc formatted students; // 更加详细
7.修改列
查询表结构
desc students2;
添加列
alter table students2 add columns (education string);
ALTER TABLE 表名 ADD COLUMN 列名 数据类型;
查询表结构
desc students2;
更新列
alter table stduents2 change education educationnew string;
ALTER TABLE 表名 CHANGE 旧列名 新列名 新数据类型;
8.删除表
drop table students2;
6.Hive内外部表
面试题:内部表和外部表的区别?如何创建外部表?工作中使用外部表
1.hive内部表
当创建好表的时候,HDFS会在当前表所属的库中创建一个文件夹
当设置表路径的时候,如果直接指向一个已有的路径,可以直接去使用文件夹中的数据
当load数据的时候,就会将数据文件存放到表对应的文件夹中
而且数据一旦被load,就不能被修改
我们查询数据也是查询文件中的文件,这些数据最终都会存放到HDFS
当我们删除表的时候,表对应的文件夹会被删除,同时数据也会被删除
默认建表的类型就是内部表
// 内部表
create table students_internal
(
id bigint,
name string,
age int,
gender string,
clazz string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/input2';
hive> dfs -put /usr/local/soft/data/students.txt /input2/;
2.Hive外部表
(多了个 external 关键字)
外部表说明
外部表因为是指定其他的hdfs路径的数据加载到表中来,所以hive会认为自己不完全独占这份数据
删除hive表的时候,数据仍然保存在hdfs中,不会删除。
// 外部表
create external table students_external
(
id bigint,
name string,
age int,
gender string,
clazz string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/input3';
hive> dfs -put /usr/local/soft/data/students.txt /input3/;
删除表测试一下:
hive> drop table students_internal;
Moved: 'hdfs://master:9000/input2' to trash at: hdfs://master:9000/user/root/.Trash/Current
OK
Time taken: 0.474 seconds
hive> drop table students_external;
OK
Time taken: 0.09 seconds
hive>
一般在公司中,使用外部表多一点,因为数据可以需要被多个程序使用,避免误删,通常外部表会结合location一起使用
外部表还可以将其他数据源中的数据 映射到 hive中,比如说:hbase,ElasticSearch......
设计外部表的初衷就是 让 表的元数据 与 数据 解耦