Hive

hive是一个数仓工具,基于hadoop,可以用来提取,转化,加载存储在hdfs中的大规模数据。

将sql语句转换成mapreduce任务来执行。

其表的元数据存储在关系型数据库中,默认为derby,但是该数据库不支持多客户端,因为derby数据库的数据信息是存放在当前目录下的,所以多个目录下客户端使用时,数据不互通。所以广泛使用mysql。

同样处理引擎MR也可以换成spark。

当sql语句不生成mapreduce任务时,其操作都是在操作的元数据。

数据类型

基本数据类型

类似java

集合数据类型

  • struct
    类似c中的结构体,java中的javabean。
    定义了属性名和属性类型

  • map
    键值对

  • array
    数组

集合数据类型之间可以进行嵌套

map

HQL

DDL

建库

  1. create database [if not exists] database_name
  2. [comment ""] //描述
  3. [location "/hdfs_path"] //hdfs路径
  4. [with dbproperties(property_name=value).. ] //数据库参数

删除与修改

drop database name只能删除空表,删除后元数据宜一并删除。

drop database name cascade强制删除

alter database name set dbproperties(createtime="2010-01-01")修改信息只能修改扩展参数dbproperties属性。

建表语句

可选项:

  1. external:外部表
  2. partitioned by:分区表
  3. clustered:分桶表
  4. row format:行格式
  5. stored:文件格式
  6. location:表位置信息
  7. tblproperties:表额外属性、

示例:

  1. create table test( //建表语句
  2. name String, //参数name,类型字符串
  3. friends array<String>, //参数friends,类型数组
  4. children map<String, int>, //参数children,类型map
  5. address struct<stree:String, city:String> //参数address,类型Struct
  6. )
  7. row format delimited //行格式定义
  8. fields terminated by ',' //字段间隔符使用,
  9. collection items terminated by '_' //集合中多条数据分割符使用_,如多个friends:f1_f2_f3。多个children: c1:18_c2:19_c3:20。多个struct: s1:beijing_s2:shanghai
  10. map keys terminated by ':' //指定map集合中kv分割使用:,如多个children: c1:18_c2:19_c3:20。
  11. lines terminated by '\n'; //多条记录使用换行

集合数据访问时可以使用下标指定。

map中访问使用 字段[key值]的方法访问。类似java中get(key)

struct结构体中使用 字段名.属性 的方法访问。和java一样

内部表与外部表

内部表:管理表,默认建表类型

区别:内部表删除时,会同时删除数据,外部表只删除元数据。

外部表的用途:外部表的数据不只有hive使用,还有其他用途的时候,不能够直接删除数据。相对比较安全。同时可以恢复。

  • 相互转换
    修改表结构的external属性为true
    alter 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的目录

通过修改配置可以在命令行显示当前库和字段名