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