hive常见创建表方式
查看表结构详情:
desc formatted 表名
方式一:create table
指定字段信息
方式二:CTAS
通过子查询创建表
create table as Select
方式三:create like
创建类似表
create table new_table like old_table/view
Hive分区表
什么地方会使用到分区表
首先,如果要每一个月统计一次一线城市与准一线城市的交通数据
那么,如何存储数据
是建立一张表,在这张表里添加新的数据,还是每一个月,每一个城市建立一张表
显然,这两种方法都不可取
第一:如果不停的将数据添加到表中,区分数据的语句将会随着时间的增加而越来越复杂
第二:如果为每次都建立一张表,那么要建立的表的数目是很可怕的,也是不可取
此时,就用到了分区表
建立分区表
--分区字段:
-- 月份,城市
create table 表名(
字段.....
)
PARTITIONED BY (分区名 字符类型 COMMENT '分区描述',....)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n';
分区表是如何管理数据(数据文件)
普通表数据文件存储:
将表中所有数据放到对应HDFS目录下即可:
目录结构:数据库名/表名/数据
分区表:
按照分区字段创建对应分区目录,划分数据存储
目录结构:数据库名/表名/第一个分区名/第二个分区名/..分区名/数据
如何使用分区表中的分区中的数据
sql语句如下:
select
字段名
from
分区表名
where
分区名=“具体分区” and 分区名=“具体分区”
分区表加载数据
方式一:使用load加载,语句如下
LOAD DATA LOCAL
INPATH 'Linux系统中文件路径'
INTO TABLE 表名
PARTITION (分区名=“第几个分区”,...)
方式二:使用hdfs中的put命令
1:在hdfs中建立对应的分区表的文件路径
hive>dfs -mkdir -p 想要建立的分区目录
2:向该目录上传数据文件
hive>dfs -put 数据源目录 分区目录
3:修复元数据:目的,通知元数据,添加了新的分区与分区数据
方法1:修复元数据
msck repair table 表名
实现原理:扫描表下面的目录,能知道哪些分区信息
和 元数据表里面分区信息对比
方法2:添加元数据
ALTER TABLE 表名 ADD IF NOT EXISTS PARTITION(分区名=“新的分区名”,....)
4:查看分区元数据是否添加成功
show partitions 表名
严格模式
严格模式,就是防止执行危险的sql语句
危险的sql语句
Cartesian Product.笛卡尔积,join 没有on
即执行的sql语句使用了join,但是没有使用on来进行条件过滤
不使用on的后果就是会产生笛卡尔集
即如果进行join的俩张表各有十万条数据,直接join,可能就会使整个分布式集群宕机
No partition being picked up for a query.没有分区信息的查询:分区表必须指定分区字段
即查询分区表时,必须加上要查询的具体的分区,否则会查询所有分区的数据
Comparing bigints and strings.不能比较bigints与string类型的数据
Comparing bigints and doubles.不能比较bigints与doubles类型的数据
Orderby without limit. order by 没有limit
配置严格模式
方法一:修改配置文件
<property>
<name>hive.mapred.mode</name>
<value>strict</value>
</property>
方法二:会话内set设置,当前会话有效
set hive.mapred.mode = strict
外部表与分区表结合使用
外部表删除表时不会将数据删除,分区可以存储大量分组数据
创建外部分区表
--------------------------------------------
-- 外部表与分区表结合使用
-- 在删除的时候,不会删除源文件,那么我们数据不交给Hive管理,
-- 通常自己指定数据存储位置
-- 企业做法:
-- (1)往HDFS文件系统中写文件,放到指定目录下,目录包含分区字段
-- (2)修复元数据
--------------------------------------------
(1)表的数据存储目录
dfs -mkdir -p 自定义目录
(2)创建外部表,分区表
create EXTERNAL table 表名(
字段名 类型,,,
)
PARTITIONED BY (分区名 类型,...)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
--数据表文件以什么格式保存
STORED AS TEXTFILE
--保存在自定义路径
LOCATION '自定义路径'
(3)查看表详情
desc formatted 表名;
(4)加载数据
(4.1)创建数据目录
dfs -mkdir -p 数据目录
(4.2)上传数据
dfs -put 源数据 目标目录
(5)修复分区
ALTER TABLE 表名 ADD IF NOT EXISTS PARTITION (分区名=“新的分区”)
hive数据仓库与MYSQL数据的区别
hive:
属于大数据生态系统中一个技术框架、用于分析数据
数据仓库ETL工具(ETL,是英文Extract-Transform-Load的缩写,用来描述将数据从来源端经过萃取(extract)、转置 (transform)、加载(load)至目的端的过程)
建立在Hadoop之上,为用户提供SQL语句分析海量数据,离线数据分析
底层MapReduce
类似于MYSQL数据库中database和table来组织数据
hive将元数据存储在MYSQL中。
mysql:
属于RDBMS中关系型数据库的一种
数据存储和数据检索
表的数据量不大
区别:
MYSQL是检索数据,hive管理数据,偏向于分析数据
HiveServer2
介绍
将hive作为一个服务启动(类比于MYSQL服务)
bin/hive 默认会自动一个服务,为Hive 客户端提供服务
启动hiveServer2服务
前端启动:
bin/hiveserver2
ctrl +C 或者窗口关闭就没了,
后台启动:将服务作为守护进程(deamon)启动
hdfs的进程全都是后台启动
nohup bin/hiveserver2 > hiveServer2.log &
Beeline 客户端
连接方式一:
bin/beeline
!connect jdbc:hive2://主机名:10000 用户名 密码
连接方式方式二:
bin/beeline -u jdbc:hive2://主机名:10000 -n 用户名 -p 密码
通过JDBC客户端去连接
hive切换到apache版本,CDH版本,自己管理jar包
什么情况下,HiveSQL不执行MapReduce而是直接返回结果
设置属性:
set hive.fetch.task.conversion = more
哪些sql语句:
某些选择查询可以转换为单个FETCH任务,最大限度地减少延迟。
目前,查询应该是单一来源的,没有任何子查询,不应该有
任何聚合或区别(引起RS),横向视图和连接。
0. none:禁用hive.fetch.task.conversion
1. minimal:分区列上的SELECT STAR,FILTER,仅限LIMIT
2.更多:SELECT,FILTER,LIMIT only(支持TABLESAMPLE和虚拟列)