Hive
hive是一个数仓工具,基于hadoop,可以用来提取,转化,加载存储在hdfs中的大规模数据。
将sql语句转换成mapreduce任务来执行。
其表的元数据存储在关系型数据库中,默认为derby,但是该数据库不支持多客户端,因为derby数据库的数据信息是存放在当前目录下的,所以多个目录下客户端使用时,数据不互通。所以广泛使用mysql。
同样处理引擎MR也可以换成spark。
当sql语句不生成mapreduce任务时,其操作都是在操作的元数据。
数据类型
基本数据类型
类似java
集合数据类型
struct
类似c中的结构体,java中的javabean。
定义了属性名和属性类型map
键值对array
数组
集合数据类型之间可以进行嵌套
map
…
HQL
DDL
建库
create database [if not exists] database_name
[comment ""] //描述
[location "/hdfs_path"] //hdfs路径
[with dbproperties(property_name=value).. ] //数据库参数
删除与修改
drop database name
只能删除空表,删除后元数据宜一并删除。
drop database name cascade
强制删除
alter database name set dbproperties(createtime="2010-01-01")
修改信息只能修改扩展参数dbproperties属性。
建表语句
可选项:
external:外部表
partitioned by:分区表
clustered:分桶表
row format:行格式
stored:文件格式
location:表位置信息
tblproperties:表额外属性、
示例:
create table test( //建表语句
name String, //参数name,类型字符串
friends array<String>, //参数friends,类型数组
children map<String, int>, //参数children,类型map
address struct<stree:String, city:String> //参数address,类型Struct
)
row format delimited //行格式定义
fields terminated by ',' //字段间隔符使用,
collection items terminated by '_' //集合中多条数据分割符使用_,如多个friends:f1_f2_f3。多个children: c1:18_c2:19_c3:20。多个struct: s1:beijing_s2:shanghai
map keys terminated by ':' //指定map集合中kv分割使用:,如多个children: c1:18_c2:19_c3:20。
lines terminated by '\n'; //多条记录使用换行
集合数据访问时可以使用下标指定。
map中访问使用
字段[key值]
的方法访问。类似java中get(key)struct结构体中使用
字段名.属性
的方法访问。和java一样
内部表与外部表
内部表:管理表,默认建表类型
区别:内部表删除时,会同时删除数据,外部表只删除元数据。
外部表的用途:外部表的数据不只有hive使用,还有其他用途的时候,不能够直接删除数据。相对比较安全。同时可以恢复。
- 相互转换
修改表结构的external属性为truealter table table_name set tblproperties('external' = 'true');
自定义分隔符
row format delimited
fields terminated by ‘’
map terminated by ‘’
lines terminated by ‘’
修改表
修改表名:alter table table1 rename to table2
修改列信息:
- 更新列:
alter table table1 change old_col new_col new_col_type
- 增加或替换:
alter table table1 add | replace columns(add1 string)
- 增加和替换的区别在于替换是把整个表的列信息全部替换,需要全部声明
对表结构的创建和修改其实是修改mysql中的元数据。对hdfs中的真实数据没有影响,只是在查询数据时根据元数据的规定来解析hdfs中的数据。
数据导入
使用hdfs的命令直接将文件放到表对应的目录下可以进行读取。
hadoop fs -put '/path'
另外:
load data [local] inpath '/本地路径' [overwrite] into table tab1 [partition (partcol1=val,...)]
;
- load:加载数据
- local:本地文件,否则从hdfs中加载
- inpath:加载路径
- overwrite :覆盖表中现有数据
- partition:指定分区
三种数据插入方式对元数据中numRows和numFiles的修改
hdfs:两个值都不会变化
insert:两个值都变化
load:numRows不变,Files加一
原因:insert通过MR进行插入,会解析每一条,所以两个值都变化,put是hadoop的命令,不会操作元数据,load是通过读取文件来修改元数据的,所以文件数会变化。
造成的结果是count(*)查询时,会引起数据条数不对的问题。查到的数据条数小于实际数量。
insert
- insert into :普通插入,追加插入
- insert overwrite table:会覆盖表中数据
hive命令行
通过-e能够在命令行直接执行sql语句 bin/hive -e "select * from test"
通过-f能够在读取文件中的sql执行 bin/hive -f test.sql
通过dfs -ls /;
可以查看hdfs的目录
通过修改配置可以在命令行显示当前库和字段名