Hive

hive的本质

  1. Hive处理的数据存储在HDFS
  2. Hive分析数据底层的实现是MR
  3. 执行程序运行在Yarn上

Hive的优缺点

  1. 操纵接口使用SQL语法,容易上手
  2. 避免去写MR
  3. 优势在于处理海量数据,支持海量数据的分析与计算
  4. 支持自定义函数,根据项目需求来实现函数

缺点

  1. hive延迟比较高,一般采用hive on spark用spark底层来处理数据,速度快
  2. hive调优比较困难,粒度教大等
    10.hive分析的数据存储在hdfs,hdfs不支持随机写,只支持追加写,所以在hive不能delete 和update,只能slect和insert

Hive架构原理

在这里插入图片描述
10. 驱动器Driver

  1. 解析器 :将SQL字符串转换成抽象语法树AST,对AST进行语法分析,比如表是否存在。字段是否存在
  2. 编译器 :将AST编译生成逻辑执行计划
    3.优化器 : 对逻辑执行计划进行优化
    4 执行器 :把逻辑执行计划转换成可以运行的物理计划,就是执行MR/SPARK
  1. hive的元数据管理默认使用derby,建议把元数据存储到mysql中,将MySQL的JDBC驱动拷贝到Hive的lib目录下
    执行语言如下:

cp /opt/software/mysql-connector-java-5.1.37.jar $HIVE_HOME/lib

在$HIVE_HOME/conf目录下新建hive-site.xml文件

vim $HIVE_HOME/conf/hive-site.xml
添加内容

<property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://hadoop2:3306/metastore?useSSL=false</value>
<!-- jdbc连接的Driver-->
<property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
<!-- jdbc连接的username-->
<property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>root</value>
</property>

<!-- jdbc连接的password -->
<property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>123456</value>
</property>
<!-- Hive默认在HDFS的工作目录 -->
<property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/user/hive/warehouse</value>
</property>

<!-- 指定hiveserver2连接的端口号 -->
<property>
    <name>hive.server2.thrift.port</name>
    <value>10000</value>
</property>
<property>
    <name>hive.server2.thrift.bind.host</name>
    <value>hadoop2</value>
<!-- 指定存储元数据要连接的地址 -->
<property>
    <name>hive.metastore.uris</name>
    <value>thrift://hadoop2:9083</value>
</property>
<!-- 元数据存储授权  -->
<property>
    <name>hive.metastore.event.db.notification.api.auth</name>
    <value>false</value>
hive.metastore.schema.verification false hive.server2.active.passive.ha.enable true

hive的运行机制

在这里插入图片描述

Hive建表规定

row format delimited fields terminated by ‘,’ – 列分隔符
collection items terminated by ‘_’ --MAP STRUCT 和 ARRAY 的分隔符(数据分割符号)
map keys terminated by ‘:’ – MAP中的key与value的分隔符
lines terminated by ‘\n’; – 行分隔符

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name
data_type [COMMENT col_comment], …)] [COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], …)]
[CLUSTERED BY (col_name, col_name, …) [SORTED BY (col_name
[ASC|DESC], …)] INTO num_buckets BUCKETS] [ROW FORMAT row_format]
[STORED AS file_format] [LOCATION hdfs_path] [TBLPROPERTIES
(property_name=property_value, …)] [AS select_statement] [LIKE
table_name]

字段说明:

1)CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXISTS
选项来忽略这个异常。
(2)EXTERNAL关键字可以让用户创建一个外部表,在建表的同时可以指定一个指向实际数据的路径(LOCATION),在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
(3)COMMENT:为表和列添加注释。
(4)PARTITIONED BY创建分区表
(5)CLUSTERED BY创建分桶表
(6)SORTED BY不常用,对桶中的一个或多个列另外排序
(7)ROW FORMAT DELIMITED [FIELDS
TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char]
[MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char] | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value,
property_name=property_value, …)]
用户在建表的时候可以自定义SerDe或者使用自带的SerDe。如果没有指定ROW FORMAT 或者ROW FORMAT
DELIMITED,将会使用自带的SerDe。在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的SerDe,Hive通过SerDe确定表的具体的列的数据。
SerDe是Serialize/Deserilize的简称, hive使用Serde进行行对象的序列与反序列化。 (8)STORED
AS指定存储文件类型
常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、RCFILE(列式存储格式文件)
如果文件数据是纯文本,可以使用STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE。
(9)LOCATION :指定表在HDFS上的存储位置。 (10)AS:后跟查询语句,根据查询结果创建表。
(11)LIKE允许用户复制现有的表结构,但是不复制数据。

数据导入

load data [local] inpath ‘数据的path’ [overwrite] into table student [partition (partcol1=val1,…)];

(1)load data:表示加载数据
(2)local:表示从本地加载数据到hive表;否则从HDFS加载数据到hive表
(3)inpath:表示加载数据的路径
(4)overwrite:表示覆盖表中已有数据,否则表示追加
(5)into table:表示加载到哪张表
(6)student:表示具体的表
(7)partition:表示上传到指定分区

上传文件到hdfs

dfs -put /opt/module/hive/datas/student.txt /user/指定路径下;
加载数据覆盖表中已有的数据
load data inpath ‘/user/atguigu/student.txt’ overwrite into table student;

into和overwrite的区别

insert into:以追加的方式插入到表或者分区,原有的数据不会删除
insert into table student2 values(1,‘wangwu’),(2,‘zhaoliu’);
insert overweitr: 会覆盖表中已经存在的数据。
insert overwrite table student2 select id, name from student where id < 1006;
insert不支持插入部分字段,并且后边跟select语句时,select之前不能加as,加了as会报错,一定要跟下面的as select区分开。
create table if not exists student3 as select id, name from student;

Import数据到指定Hive表中

先用export导出后,再将数据导入。并且因为export导出的数据里面包含了元数据,因此import要导入的表不可以存在,否则报错
import table student2 from
‘/user/hive/warehouse/export/student’;

数据导出

  1. Insert导出

格式化导出到本地:insert overwrite local directory ‘/opt/module/hive/datas/export/student1’
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t’ select * from student;
导出到集群: insert overwrite directory ‘/user/atguigu/student2’
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t’
select * from student;
insert 导出,导出的目录不用自己提前创建,hive会帮我们自动创建,但是由于是overwrite,所以导出路径一定要写具体,否则很可能会误删数据。这个步骤很重要,切勿大意。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值