【若泽大数据实战第十五天】Hive DDL学习
hive 小知识点:
①
数据:存放在HDFS 之上
元数据:存放在mysql里(相关配置在hive-site.xml里面)
②
启动hive之前需要的前提:hdfs和yarn先启起来。(yarn不起来可能还不会影响,但是hdfs一定要启起来,hive跑的时候,yarn一定要启起来。)
③
官方提供的配置文件template为结尾,这个都是模板,需要的时候,cp一份,然后把 .template后缀去掉,再修改。
hive的日志配置在:hive-log4j.properties.template 在这里面配置。这个文件里有下面两行:
hive.log.dir=${java.io.tmpdir}/${user.name}
hive.log.file=hive.log
第一个代表日志存放的路径:在/tmp/(根目录下tmp文件夹下面)hive所属用户的名称(这里是hadoop用户下,所以是hadoop)
④
一个非常经典的异常信息:
An exception was thrown while adding/validating class(es) : Specified key was too long; max key length is 767 bytes
⑤
hive SQL学习路径:http://hive.apache.org/
这上面是最权威的,百度查的什么的不一定是对的,所以有问题在这上面去找。
⑥
在Hive里面:DB/TABLE/PARTITION(数据库、表、分区) 都是目录或者文件夹
在hive里面的组织方式要么是文件夹要么是文件。
⑦DDL学习:
Create Database
CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
[COMMENT database_comment] (对数据库做一个描述)
[LOCATION hdfs_path] (指定一个存放数据库的路径(因为数据库组织方式是文件夹))
[WITH DBPROPERTIES (property_name=property_value, ...)]; (加上DB的一些属性)
必选 (二选一)【可选】必选
【可选】
【可选】
【可选】
比如:CREATE DATABASE hive;
备注:[LOCATION hdfs_path] 如果不指定路径,那么就会使用默认的路径。
(默认会有一个default数据库)
(创建一个test数据库)
(show一下,test数据库已经存在,但是test数据库存在哪里?)
desc database test;
用 desc database 数据库名称 就可以查看相关信息了。
这里的信息是:hdfs://10-9-140-90:9000/user/hive/warehouse/test.db
①hdfs://10-9-140-90:9000 :这个是 HDFS目录,可以在core-site.xml文件里查到(有些hadoop是8020端口):
/home/hadoop/app/hadoop-2.6.0-cdh5.7.0/etc/hadoop/core-site.xml
②/user/hive/warehouse/:默认的hive存储在HDFS上的目录
从hive官网的Hive wiki.里面进入,然后找到下图的Hive Configuration Properties:
(hive的所有的配置信息在这里面都可以找到)
打开后搜一下找到下面这个:
从这个可以看到hive数据仓库的元数据信息的默认路径是:/user/hive/warehouse
下面讲一下在hive中,修改hive参数的两种形式:
1) set hive.metastore.warehouse.dir;
set key 取值
set key=value 设置值
这种设置是局部的,支队当前窗口有效,是单session的。
2)配置hive-site.xml
在这里面配置出你要修改的参数,这里的修改是全局的。
上面两个各有优缺点,你设置了第二种方式,可能会影响到他人的使用。用第一种也最好在你用完之后,把参数再设置回去。
③hdfs://10-9-140-90:9000/user/hive/warehouse/test.db中test.db是数据的名称,固定的格式 数据库.db 后面都要加个db。
创建database时指定路径,创建在哪里。比如:
CREATE DATABASE test2
location '/d6_hive/directory';
hive 元数据:
hive元数据是存放在mysql里面的。在hive-site.xml里面配置。
登上mysql数据库查看:
select * from dbs \G; 查看一下dbs这张表:( \G表示格式化一下)
这里面就是元数据信息。
row format/ file format:行分隔符和文件分隔符
两大分隔符:行与行 字段与字段之间的分隔符
列分隔符(默认是):\001 行与行之间的分隔符默认是 换行符
file格式:行式 列式
数据类型:常用的基本用这些就够了
数值类型: int bigint float double DECIMAL
字符串:string (包括date类型也用string来表示,这样会方便一些)
小知识点补充;
你用数据库的时候,不知道用的是哪个数据库,看不到相关信息,可以这样设置:
把hive.cli.print.current.db这个参数修改成true就可以了。
这个是在当前窗口生效,如果想在全局生效,需要修改hive-site.xml文件:
加入这几行:
(这里只是被注释掉了而已)
hive表的创建(一定要掌握的):
下面创建一张这个txt存放的这张表:
(可以参照官网,不过掌握下面这个常用的基本差不多了)
create table emp(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int
) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
最后一句是列与列之间的分隔符是'\t',行与行的分隔符默认是回车,这里不用写了。
(
如果出现下图这种常见的错误:(这个可能跟字符集有关,比如utf-8 lating gbk32什么的)
需要保证hive的字符集与mysql的元数据数据库的字符集保持一致。
alter database ruoze_d6 character set latin1;
use ruoze_d6;
alter table PARTITIONS convert to character set latin1;
alter table PARTITION_KEYS convert to character set latin1;
)
DML语句:
LOAD加载数据:官网有详细解释
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename ;
LOCAL: 从本地(linux)加载数据 ,如果没有写,就是从hdfs上加载。
LOAD DATA LOCAL INPATH '/home/hadoop/data/emp.txt' OVERWRITE INTO TABLE emp ;
如何设置列名:
在hive-site.xml里面设置下面两个参数即可。看需要去设置。也可以不设置,直接在当前session 进行set。
创建表结构,不含数据:
CREATE TABLE emp2 LIKE emp;
创建emp一样的表,并copy数据到新表里面:
create table emp3 as select * from emp;
重命名表:
ALTER TABLE emp3 RENAME TO new_emp3;
查看表的字段信息: desc emp;
查看详细信息: desc extended emp;
有点乱,看着不方便
推荐查看方式: desc formatted emp;
内部表/外部表:(面试经常遇到)
从上图可以看出,有个Table Type:MANAGED_TABLE
MANAGED_TABLE:内部表 (hive里面默认是内部表)
比如:
create table emp_managed as select * from emp; (这种创建的都是默认的内部表)
去mysql里面查一下tbls这张元数据表,
select * from tbls \G;
可以看到有条记录:
再看hdfs上,它存放的数据:
然后删除这张表:
然后再去mysql查一下,select * from tbls \G; ,emp_managed这张表就没有元数据信息了。
再去hdfs上看一下,发现也没有emp_managed数据了:
外部表:
现在创建一张外部表:
create EXTERNAL table emp_external(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int
) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
location '/d6_hive/external';
mysql里面tbls表中是可以查到emp_external这个表的。
但是刚创建的表是没有数据的,现在用以下命令把本地的数据上传上去。
然后再用hive查一下就有数据了:
然后把表给删掉:
然后再去mysql里面查: select * from tbls \G; 就没有emp_external这张表了。
然后再去hdfs上查看,发现数据没有删除:
所以:
删除内部表:数据+元数据 删除
删除外部表:数据不删,元数据删
1)内部表和外部的区别以及使用场景
其它项目组也用
防止误删表
2)梳理元数据信息表中的DBS和TBLS中的字段信息
desc哪里来的
底层拼出来的SQL查询出来的