hadoop与hive的基本使用-大数据学习系列(二)
Hadoop使用(初步)
1.HDFS上传文件
http://【你机器的IP】:9870/explorer.html#/ |
|
执行命令
#创建目录
mkdir /export/data
#进入目录
cd /export/data/
#文件创建
touch a.txt
echo "hello" > a.txt
#将a.txt 传到HDFS的根目录
hadoop fs -put a.txt /
去网页端查看
|
2.运行mapreduce程序验证
在Hadoop安装包 share 目录下有maprduce的示例
运行示例文件
ls /home/module/hadoop/hadoop-3.3.4/share/hadoop/mapreduce/
hadoop jar /home/module/hadoop/hadoop-3.3.4/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar pi 2 1000
|
|
Hive使用(初步)
- 首先确保服务都已启动
#未启启动的话请按如下顺序启动 hadoop 和 hive 服务
start-all.sh
tail -f /tmp/root/hive.log
hive --service metastore
hive --service hiveserver2
- 配置三方客户端连接
|
- hive数据库表操作
3.1 创建数据库
#执行创建数据库的语句
create database if not exists hivedb01;
#查看数据库
show databases;
#选择当前数据库
use hivedb01;
显示如图
|
|
3.2 查看数据库详情
#查看数据库详情
desc database hivedb01;
|
我们看到 hdfs://k8s-master:8020/user/hive/warehouse/hivedb01.db 这个目录下对应我们的数据库。
PS:数据表的存储位置可以在 hive-site.xml 中用 hive.meastore.warehouse.dir 的属性来指定,不指定则是默认的/user/hive/warehouse地址。
这个部分信息也可以在我们之前设置的mysql元数据库中被查询到 |
|
我们访问HDSF路径能在默认的 /user/hive/warehouse 找到我们刚创建的DB文件
http://【你自己机器的IP】:9870/ |
|
再点进去看到db文件中没有任何数据 |
|
#删除数据库的语法 drop database [数据库名称] cascade;
3.3 表操作
创建表的语法为
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [COMMENT col_comment], ...)]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
[CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
[SKEWED BY (col_name, col_name, ...) ON ((col_value, col_value, ...), (col_value, col_value, ...), ...) [STORED AS DIRECTORIES]]
[STORED AS file_format]
[LOCATION hdfs_path]
[TBLPROPERTIES (property_name=property_value, ...)]
[AS select_statement];
关键字和语句的含义如下:
CREATE: 创建一个新表
TEMPORARY: 可选,表示创建一个临时表
EXTERNAL: 可选,表示创建一个外部表
IF NOT EXISTS: 可选,表示如果表已经存在,则不会创建新表
table_name: 表名
column_name: 列名
data_type: 数据类型
COMMENT: 可选,列或表的注释
PARTITIONED BY: 可选,分区列和数据类型的列表
CLUSTERED BY: 可选,分桶列的列表
SORTED BY: 可选,排序列和排序方式的列表
num_buckets: 可选,分桶的数量
row_format: 可选,指定行的格式
file_format: 可选,指定文件的格式
LOCATION: 可选,指定表数据的存储位置
TBLPROPERTIES: 可选,表属性的键值对列表
在Hive SQL中,内部表和外部表是有区别的,主要体现在表的数据存储和管理方面
存储位置的管理:
内部表:表数据存储在Hive管理的HDFS文件系统中,并且在表被删除时,表数据也会被删除。
外部表:表数据存储在外部HDFS文件系统或者本地文件系统中,表被删除时,表数据不会被删除。
数据的维护:
内部表:表的数据是由Hive直接管理的,可以通过Hive的DDL操作来修改表的结构或者添加/删除数据。
外部表:表的数据是由外部数据源管理的,例如HDFS或本地文件系统,因此表的结构无法通过Hive的DDL操作来修改,只能通过外部数据源来修改。
数据备份和恢复:
内部表:表数据被管理在HDFS文件系统中,可以使用Hadoop的数据备份和恢复工具(例如HDFS的snapshot或者Hadoop的DistCp)来进行备份和恢复。
外部表:表数据由外部数据源管理,无法使用Hadoop的数据备份和恢复工具来进行备份和恢复。
总之,内部表和外部表适用于不同的场景。内部表适合于需要管理数据存储位置和方便修改表结构的场景,而外部表适合于需要与其他数据源进行交互或需要避免数据丢失的场景。
3.3.1 内部表操作
use hivedb01;
#创建表
create table if not exists tb1(id int,recoder String,remark String) row format delimited fields terminated by ',';
执行建表语句后 |
|
查看HDFS目录 发现已经出现tb1 文件夹 不过里面没有内容 |
|
|
SQL命令方式传入数据
#继续插入2条数据
insert into tb1 values(1,"recoder1","remark1");
insert into tb1 values(2,"recoder2","remark2");
#查询数据
select * from tb1;
|
查看HDFS文件目录 已经有记录 |
|
|
也可以使用 desc formatted [表名] 查看这个表的更详细的结构信息 |
|
#清理数据 删除表 将会将所有的数据包括元数据删除
drop table tb1;
再次查看HDFS已经不存在了
|
文件上传方式传入数据
#重新创建表
create table if not exists tb1(id int,recoder String,remark String) row format delimited fields terminated by ',';
#其他的命令
#复制表语句
#create table [新表名] as select * from [目标表]
#复制表结构语句
#create table [新表名] like [目标表]
#先建立一个文件目录
mkdir -p /home/test
cd /home/test
#首先按照格式创建一个文件
cat > tb1.data << EOF
1,recoder1,remark1
1,recoder1,remark1
1,recoder1,remark1
1,recoder1,remark1
1,recoder1,remark1
1,recoder1,remark1
1,recoder1,remark1
1,recoder1,remark1
1,recoder1,remark1
EOF
http://【你自己的机器IP】:9870/ |
|
#复制路径 /user/hive/warehouse/hivedb01.db/tb1
#上传
hadoop fs -put tb1.data /user/hive/warehouse/hivedb01.db/tb1
#上传中表内就有数据了
|
3.3.2 外部表操作
外部表建表方式和内部表相同,区别在于需要带上 EXTERNAL 参数,这样删除表的时候,数据仍然会存放在hdfs当中。
load data 命令本地文件传入数据
step1.数据准备
#创建需要导入的文件
cd /home/test
#创建图书价格文件
cat > book.txt << EOF
001,java核心技术,50
002,vue.js开发,80
003,微信小程序开发,77
004,go语言开发,150
005,mysql8精通,80
006,UML参考手册,70
007,netty核心编程,130
008,hive性能调优,50
009,kubernetes修炼手册,200
EOF
step2.建表并load数据
#创建book表
create external table book(bookid string,bookname string,price int) row format delimited fields terminated by ',';
#向表中追加数据
load data local inpath '/home/test/book.txt' into table book;
#覆盖表中数据
load data local inpath '/home/test/book.txt' overwrite into table book;
|
load data hdfs本地文件传入数据
#创建需要导入的文件
cd /home/test
#创建书籍分类文件
cat > bookkind.txt << EOF
01,历史类
02,技术类
03,修仙类
04,03
04,科幻类
EOF
#向hadoop上上传文件
hadoop fs -mkdir -p /mydatas
hadoop fs -put bookkind.txt /mydatas/
#上传表
create external table bookkind(kindid string,typename string) row format delimited fields terminated by ',';
#从hadoop目录装载数据
load data inpath '/mydatas/bookkind.txt' into table bookkind;
|
3.4 其他的表操作方式
#创建需要导入的文件
cd /home/test
#创建书籍分类文件
cat > kind.txt << EOF
01,历史类
02,技术类
03,修仙类
04,科幻类
05,武侠类
EOF
#上传文件
hadoop fs -put kind.txt /mydatas/
#创建三个表 公用一个文件区域
create external table kind1(kindid string,typename string) row format delimited fields terminated by ',' location '/mydatas';
create external table kind2(kindid string,typename string) row format delimited fields terminated by ',' location '/mydatas';
create external table kind3(kindid string,typename string) row format delimited fields terminated by ',' location '/mydatas';
|
Hive表操作(扩展)
分区表
--创建一个按月的分区表
create table book_year_part(bookid string,bookname string,price int) partitioned by (year string) row format delimited fields terminated by ',';
--查看表
desc book_year_part;
--创建一个按年月日分区表
create table book_all_part(bookid string,bookname string,price int) partitioned by (year string,month string,day string) row format delimited fields terminated by ',';
--查看表
desc book_all_part;
#加载数据到 年分区表
load data local inpath '/home/test/book.txt' into table book_year_part partition(year='2002');
#加载数据到 年月日分区表
load data local inpath '/home/test/book.txt' into table book_all_part partition(year='2002',month='12',day='1');
|
|
|
--查看分区信息
show partitions book_all_part;
--添加多个分区
alter table book_year_part add partition(year='2023') partition(year='2024');
|
分桶表
将数据按字段划分,分别将数据按照字段划归到多个文件中去
#设置reduce个数
set mapreduce.job.reduces = 5
--创建分桶表
create table book_bucket(id string ,name String ,gid String) clustered by(gid) into 3 buckets row format delimited fields terminated by ',';