Hive的DDL学习

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文件:

加入这几行:
在这里插入图片描述

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 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查询出来的

本文标题:Hive的DDL学习

文章作者:skygzx

发布时间:2019年04月07日 - 12:04

最后更新:2019年04月07日 - 19:31

原始链接:http://yoursite.com/2019/04/07/Hive的DDL学习/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------本文结束感谢您的阅读-------------
0%