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学习路径:Apache Hive

这上面是最权威的,百度查的什么的不一定是对的,所以有问题在这上面去找。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值