1.小知识点:
①
Hive数据一共分为两部分,一种是以数据形式存储在hdfs上,另一种是以元数据的形式存储在数据库上或者是关系型数据库上(元数据相关的配置在hive-size.xml中)
②
在启动Hive时,一定要先将hdfs和yarn先启动起来。
③当启动 Hive时,会发现有一些错误,这些错误有的很短,我们应该去哪里查看错误的详细情况:
官方文档都是以.template结尾,需要用的时候,cp一份将.template去掉,再进行修改,hive的日志配置在这里配置:hive-log4j.properties.template,进入文件,会有下面两行信息:
hive.log.dir=${java.io.tmpdir}/${user.name}
hive.log.file=hive.log
第一个代表日志存放的位置:/tmp目录下(这里的tmp指的是根目录下的tmp)用户的名称(这里指的是hadoop)
④
一个非常经典的错误:
An exception was thrown while adding/validating class(es) : Specified key was too long; max key length is 767 bytes
⑤
如何使用Hive;首先打开官网,我们要学会查看官网,http://hive.apache.org/
官网上是最权威的,不要百度,谁知道你找的是哪个版本的。
这几个是常用的DDL语法;
在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] 如果不指定路径,那么就会使用默认的路径。
这里的信息是: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里面进入,然后找到下图的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时指定路径,创建在哪里。比如
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文件:
加入这几行:
下面创建一张这个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;)
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 formatted emp;
内部表/外部表:(面试经常遇到)
从上图可以看出,有个Table Type:MANAGED_TABLE
MANAGED_TABLE:内部表 (hive里面默认是内部表)
比如:
create table emp_managed as select * from emp; (这种创建的都是默认的内部表)
去mysql里面查一下tbls这张元数据表,
select * from tbls \G;
可以看到有条记录:
外部表:
现在创建一张外部表:
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这个表的。
但是刚创建的表是没有数据的,现在用以下命令把本地的数据上传上去。
然后把表给删掉:
然后再去mysql里面查: select * from tbls \G; 就没有emp_external这张表了。
然后再去hdfs上查看,发现数据没有删除:
所以:
删除内部表:数据+元数据 删除
删除外部表:数据不删,元数据删
1)内部表和外部的区别以及使用场景
其它项目组也用
防止误删表
2)梳理元数据信息表中的DBS和TBLS中的字段信息
desc哪里来的
底层拼出来的SQL查询出来的