面对信息化时代,稍不注意就会脱轨,所以及时的补充知识才能让我们与时俱进,今天给大家带来的是关于hive查看表结构和hive 表结构查看的一篇文章,相信会给你带来较大的帮助!
摘要: Hive , Shell
Hive复制表包括两种
对于非分区表如果要完全复制一张表到另一张表,直接使用CREATE TABLE … AS语句即可,比如以下复制一个表的两个字段以及字段的值到另一个表
对于分区表如果使用CREATE TABLE … AS语句则分区失效,但是可以执行不报错,且字段和数据都能完全复制
以上有一张分区表,以dt字段作为分区,使用CREATE TABLE … AS进行全表复制
检查表结构和表数据量都没有问题
检查分区,报错此表不是分区表,is not a partitioned table,但是在表结构中确实存在本来的分区字段dt,此时dt字段的分区功能失效,但是数据保留住了
分区表的全称复制且带有分区的操作方法需要使用 LIKE 语句复制到分区信息,具体步骤如下
第一步复制得到一张空表,具有原表的表结构和分区信息
下一步使用hdfs命令操作将原表在hdfs的存储路径复制到新表的路径, 一张表的存储路径是一个目录,该目录下还存在子目录,每一个子目录代表一个分区,在分区目录下就是数据文件,数据文件是part开头格式,由Hive的分桶策略将同一分区下的数据进行划分
复制语句采用 * 通配符将原表目录下所有文件复制到新表路径下,查看新表的hdfs路径下数据文件
此时新表虽然对应数仓目录下有数据文件,但是在Hive客户端还是查不到数据为空表, 因为一个个数据分区不存在在新表的元数据中,数据是以分区目录为单位聚合的,新表目前查不到一个分区则自然查不到数据
下一步修复表的分区元数据,使用 MSCK REPAIR TABLE 命令
由输出的执行过程可见MSCK REPAIR TABLE命令先检查了表的分区信息是否存在在元数据,然后对不存在的分区信息进行修复,修复后该表即可正常使用
MSCK REPAIR TABLE 的作用是 只需要只用这一个命令就可以 快速 , 自动化 地添加(修复)全部分区 ,在Hive中如果先建分区表,并且以数据拷贝到对应HDFS目录这种方式作为初始化,需要手动添加分区才能使用,如果分区过多,使用 ALTER TABLE ADD PARTITION 极为不变,下面做一下测试看ALTER TABLE ADD PARTITION是否也能完成分区表的完全复制
下一步采用手动添加1个分区dt=’20201209′
验证了手动分区能够完成, MSCK REPAIR TABLE只是自动化的扫描一遍数仓目录下的分区信息(dt=’20201209′ 到 dt=’20210317′) ,如果编写一个Shell脚本也能实现如下
运行这个Shell脚本后能达到同样的效果,但是这个脚本执行了15分钟,需要频繁启动和关闭Hive进程
hive的语法和sql语法大部分是是相同的,下面我们来挨个写出来:
1,简单介绍存储原理:
hive和hdfs交互,以及和本地linux交互,分为本地文件和hdfs文件,要说他们的区别,底层都是存在磁盘上,要说区别的话,hdfs分布式文件管理系统,有它独有的文件存储结构也即是能够和分布式文件进行交互的独有存储方式,Linux本地文件存储知识单纯的在Linux操作系统存储的文件,所以hive的作用就是和linux本地以及linux上hdfs文件两者进行交互,我可以把本地的文件上传到hive文件中,当然hive只是处理hdfs上文件的一个工具,但是hive也有自己独有的文件存储,表的结构信息,创建的表信息,都在hive文件夹中当然是存储在hdfs上的。
2,语法:
1,把本地的文件加载到hive创建的表中(比如:create table tb_user(id int ,name string ); )在hive中创建的是有结构的表,然后通过命令:load data local inpath ‘ 路径 ‘ into table 创建的表名;
2,加载hdfs上的文件到hive中:load data inpath ‘hdfs上的路径’ into table 创建的表
3,导出hive表到hdfs上:export table 表名 to ‘hdfs路径’ ;
4,把hdfs上的表导入到hive表中:import table (hive表 )from (hdfs上的表);(import table tb_kk from ‘/data/a’)当导入的表不存在会自动创建这张表,用于备份,或者数据转移,表的字段名和导入的字段名一样。
5,通过查询hive表中的数据并把查询的数据导出到本地:insert overwrite local directory ‘本地路径’ select * from student;
6.通过查询hive表中的数据并把查询的数据导出到hdfs上:insert overwrite directory ‘hdfs上的路径’
select * from student;
7, 把查询的结果插入到 当前的hive表中 : insert overwrite table student partition(month=’201708′) select id, name from student where month=’201709′;
8,创建表并加载查询到的数据:create table if not exists tb_text as select *from tb_text;(as 关键字 同样)
9,创建表时通过Location指定加载数据路径:create table tb_text (id int , name string ) row format delimited fields terminated by ‘,’ location ‘/hdfs上的目录’,(记住是目录)。
10,创建分区表,分区表就是能够把不同的数据分开来存放,在查询的时候只需要查询指定的分区就行,这样子能够加快查询效率:create table tb_text (id int ,name string ) partitioned by (month string) (//这里我用month来作为分区条件,分区字段不能是表中已经存在的字段,可以将分区字段看成表的伪列,不参与真实字段的 ) row format delimited fields terminated by ‘,’ ;看一下加载数据到分区表的列子,更好地理解一下,load data local inpath ‘/opt/module/datas/dept.txt’ into table default.dept_partition partition(month=’201709′);//最后就是给伪列字段赋予分区值,也就是分区的文件名。
11,查看表结构,这个需要了解清楚:desc tb_text 查看基本表信息,desc formatted tb_text ,查看详细信息。
12,当数据库存在数据强制删除时可以用:drop database db_hive cascade;
13,当数据库不存在数据:drop database db_hive;
14,默认创建的表为管理表,也称之为内部表,数据和表结构是在一起的,也就是说,当我删除表的时候,底层数据也会跟着一起删除,设计成这样要求一张表代表一份数据,保证数据的安全性。
15,外部表为只存储表的元数据和结构信息,存储的是表的路径,删除外部表不会删除内部数据,只会把表的元数据信息删除了,不影响数据本身,通常用作共享数据,设计外部表的语法为:create external table tb_text(id int ,name string);
16,创建表的时候复制表结构:create table tb_text like tb_text01;
3,外部表和内部表的转化:
1,修改内部表为外部表:alter table tb_text set tblproperties(‘EXTERNAL’=’TRUE’);
2,修改外部表为内部表:alter table tb_text set tblproperties(‘EXTERNAL’=’FALSE’); — 要求KV的大小写,(‘EXTERNAL’=’TRUE’)和(‘EXTERNAL’=’FALSE’)为固定写法,区分大小写!
语法 :
(1)load data:表示加载数据
(2)local:表示从本地加载数据到hive表;否则从HDFS加载数据到hive表
(3)inpath:表示加载数据的路径
(4)overwrite:表示覆盖表中已有数据,否则表示追加
(5)into table:表示加载到哪张表
(6)student:表示具体的表
(7)partition:表示上传到指定分区
案例 :
?2)导入本地数据
?3)查看person表数据
?2)清空 person表数据; truncate table person;
?3)查看person表清空情况(已经没有数据了)
?4)导入 HDFS 数据到 person表中
?5)重新查询 person表,查看数据情况
?2) 导入HDFS,无需添加 local
?3) row format delimited fields terminated by ‘t’ ;
语法:insert into table 表名 查询语句
案例:
创建一张新表:create table if not exists person2(id int,name string,phone string);
将 person 表中id 为 1和3的数据插入到 person2表中。
查询person2表数据
方式二:into overwrite
语法:insert overwrite table 表名 查询语句
测试之前重新准备一张表
向 person6 表中添加数据。
数据结果
注意:使用 insert overwrite 后面必须加上 table ,否则报错
注意
语法 :create table [if not exists] 表名 as 查询语句
描述 :根据查询结果创建表(查询的结果会添加到新创建的表中)
案例 :
按照person表的结果创建person3表
查询 person3
注意:使用查询结果创建数据表时,需要加入 关键字
管理表
语法 :create table [if not exists] 表名(字段信息) row format delimited fields terminated by 分割符location 加载数据路径
案例 :加载person 表的数据。
查询 person 数据加载的地址
创建 person4 表并设置 person表的数据路径。
查询 person4 表信息;person4中的表数据全部来自于person表。
外部表
创建一个管理表 t1
向管理表t1中添加一条数据
创建t2 并指定t1数据的加载地址
查询 t2 表
删除 t1 表
再次查询 t2 表
验证 t1 为外部表时,删除t1表时,是否会删除数据。
重新创建 t1表
向t1中添加数据3
创建 t2(原来的给删除了)并指定为外部表,并加载 t1的数据路径
查询 t1 表结构(验证是否为外部表
查询 t2 数据(有数据2)
删除t1 表
查询 t2 表(数据并没有删除)
更加深刻理解 管理表和外部表之间的区别。
语法 :import table 全新的表名 from ‘Export 导出的地址’;
查询 person_import 表
查看家目录,生成了 一个 aaa目录,目录中有一个 000000_0 文件
查看 000000_0文件;正好是 person表中的数据。
注意:这里的 overwrite 并不是可选项(可加不可加),这里必须加上overwrite ,否则会报错。
查看 000000_0文件;使用了制表符,对数据进行格式化。
查看 /aaa/000000_0 文件
查看person_bak 文件
语法 :hive -e “sql语句” 输出路径
案例 :
查看家目录中的 person_bak
语法 :export table 表名 to ‘HDFS地址’
案例 :将 person 表的数据导出到 HDFS /person2中
查看 /person2 的层次结构
查看 /person2/data/person
对spark、hive、impala、hdfs的常用命令作了如下总结,欢迎大家补充!
1. Spark的使用:
以通过SecureCRT访问IP地址:10.10.234.198 为例进行说明:
先输入:ll //查询集群是否装有spark
su – mr
/home/mr/spark/bin/beeline -u “jdbc:hive2:/bigdata198:18000/” -n mr -p “”
show databases; //显示其中数据库,例如
use bigmax; //使用数据库bigmax
show tables; //查询目录中所有的表
desc formatted TableName; //显示表的详细信息,包括分区、字段、地址等信息
desc TableName; //显示表中的字段和分区信息
select count(*) from TableName; //显示表中数据数量,可以用来判断表是否为空
drop table TableName; //删除表的信息
drop bigmax //删除数据库bigmax
describe database zxvmax //查询数据库zxvmax信息
创建一个表
第一步:
create external table if not exists lte_Amaze //创建一个叫lte_Amaze的表
( //括号中每一行为表中的各个字段的名称和其所属的数据类型,并用空格隔开
DateTime String,
MilliSec int,
Network int,
eNodeBID int,
CID int,
IMSI String,
DataType int,
AoA int,
ServerRsrp int,
ServerRsrq int,
TA int,
Cqi0 Tinyint,
Cqi1 Tinyint //注意,最后一个字段结束后,没有逗号
)
partitioned by (p_date string, p_hour INT) //以p_date和p_hour作为分区
row format delimited fields terminated by ‘,’ /*/*表中行结构是以逗号作为分隔符,与上边的表中字段以逗号结尾相一致*/
stored as textfile; //以文本格式进行保存
第二步:添加分区,指定分区的位置
alter table lte_Amaze add partition (p_date=’2015-01-27′,p_hour=0) location’/lte/nds/mr/lte_nds_cdt_uedetail/p_date=2015-01-27/p_hour=0′;
//添加lte_Amaze表中分区信息,进行赋值。
//并制定分区对应目录/lte/nds/mr下表lte_nds_cdt_uedetail中对应分区信息
第三步:察看添加的结果
show partitions lte_Amaze; //显示表的分区信息
2. hdfs使用:
#su – hdfs //切换到hdfs用户下 、
#hadoop fs –ls ///查看进程
# cd /hdfs/bin //进入hdfs安装bin目录
hadoop fs -ls /umtsd/cdt/ //查询/umtsd/cdt/文件目录
hadoop fs -mkdir /umtsd/test //在/umtsd目录下创建test目录
hadoop fs -put /home/data/u1002.csv /impala/data/u5002 //将home/data/u1002.csv这个文件put到hdfs文件目录上。put到hdfs上的数据文件以逗号“,”分隔符文件(csv),数据不论类型,直接是数据,没有双引号和单引号
hadoop fs -rm /umtsd/test/test.txt //删除umtsd/test目录下的test.txt文件
hadoop fs -cat /umtsd/test/test.txt //查看umtsd/test目录下的test.txt文件内容
3hive操作使用:
#su – mr //切换到mr用户下
#hive //进入hive查询操作界面
hiveshow tables; //查询当前创建的所有表
hiveshow databases; //查询当前创建的数据库
hivedescribe table_name; {或者desc table_name}//查看表的字段的定义和分区信息,有明确区分(impala下该命令把分区信息以字段的形式显示出来,不怎么好区分)
hive show partitions table_name; //查看表对应数据现有的分区信息,impala下没有该命令
hive quit;//退出hive操作界面
hivedesc formatted table_name; 查看表结构,分隔符等信息
hive alter table ceshi change id id int; 修改表的列数据类型 //将id数据类型修改为int 注意是两个id
hive SHOW TABLES ‘.*s’; 按正条件(正则表达式)显示表,
[mr@aico ~]$ exit; 退出mr用户操作界面,到[root@aico]界面
impala操作使用:
#su – mr //切换到mr用户下
#cd impala/bin //进入impala安装bin目录
#/impala/bin impala-shell.sh -i 10.10.234.166/localhost //进入impala查询操作界面
[10.10.234.166:21000] show databases; //查询当前创建的数据库
[10.10.234.166:21000] use database_name; //选择使用数据库,默认情况下是使用default数据库
[10.10.234.166:21000] show tables; //查询当前数据库下创建的所有表
[10.10.234.166:21000] describe table_name; //查看表的字段的定义,包括分区信息,没有明确区分
[10.10.234.166:21000] describe formatted table_name; //查看表对应格式化信息,包括分区,所属数据库,创建用户,创建时间等详细信息。
[10.10.234.166:21000] refresh table_name; //刷新一下,保证元数据是最新的
[10.10.234.166:21000] alter TABLE U107 ADD PARTITION(reportDate=”2013-09-27″,rncid=487)LOCATION ‘/umts/cdt/
MREMITABLE/20130927/rncid=487′ //添加分区信息,具体的表和数据的对应关系
[10.10.234.166:21000] alter TABLE U100 drop PARTITION(reportDate=”2013-09-25″,rncid=487); //删除现有的分区,数据与表的关联
[10.10.234.166:21000] quit; //退出impala操作界面
[mr@aicod bin]$ impala-shell; 得到welcome impala的信息,进入impala 查询操作界面
[aicod:21000] 按两次tab键,查看可以用的命令
alter describe help profile shell values
connect drop history quit show version
create exit insert select unset with
desc explain load set use
1
进入HIVE之前要把HADOOP给启动起来,因为HIVE是基于HADOOP的。所有的MR计算都是在HADOOP上面进行的。
2
在命令行中输入:hive。这个时候就可以顺利的进入HIVE了。当然了,如果你想直接执行HQL脚本文件可以这样:hive
-f
xxxxx.hql。
3
进入hive之后一一般默认的数据库都是default。如果你切换数据库的话所建的表都会是在default数据库里面。
4
创建数据库的语法是:create
database
database_name;非常简单的,其实hive跟mysql的语法还是比较相似的。为什么呢?请继续往下
5
切换数据库的时候可以输入:use
database_name;
查看所有数据库的时候可以输入:show
databases;
查看所有表的时候可以输入:show
tables
6
看表结构的时候可以输入:describe
tab_name;
关于hive查看表结构和hive 表结构查看的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。