[Hive的DDL学习]

1.小知识点:


  Hive数据一共分为两部分,一种是以数据形式存储在hdfs上,另一种是以元数据的形式存储在数据库上或者是关系型数据库上(元数据相关的配置在hive-size.xml中)

  在启动Hive时,一定要先将hdfs和yarn先启动起来。
③当启动 Hive时,会发现有一些错误,这些错误有的很短,我们应该去哪里查看错误的详细情况:
  在这里插入图片描述
在这里插入图片描述官方文档都是以.template结尾,需要用的时候,cp一份将.template去掉,再进行修改,hive的日志配置在这里配置:hive-log4j.properties.template,进入文件,会有下面两行信息:
  hive.log.dir= j a v a . i o . t m p d i r / {java.io.tmpdir}/ 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中;
在这里插入图片描述这几个是常用的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] 如果不指定路径,那么就会使用默认的路径。
在这里插入图片描述(默认会有一个 default数据库)
在这里插入图片描述(创建一个test数据库)
在这里插入图片描述(show一下,test数据图已经存在,但是test数据库存在哪里?)
  desc database test;查看描述信息: 在这里插入图片描述
  这里的信息是: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;

可以看到有条记录:
在这里插入图片描述
再看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查询出来的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值