一、基本原理
Hive是基于Hadoop的一个数据仓库工具,可以将结构化数据文件映射成一张表,并提供类似SQL的查询功能。Hive适用于大数据离线批处理,不适合实时处理,分为内部表、外部表,可对表进行分区、分桶,提升查询效率。
(1)Hive不提供实时更新,只支持向现有的表中追加数据。
(2)Hive不存储数据,只提供SQL的解析,将SQL转化为MapReduce任务,提交到Yarn上,数据存在在HDFS中。
(3)Hive中表有分区表、分桶表,分区可按时间、地域等分区,但避免分区太细,产生过多小文件;分桶表需要先定义桶的个数,每行取哈希值再对桶个数取余,决定分到哪个桶中。分桶表相比分区表,将数据划分的更细,查询效率更高。
(4)文件存储:
TEXTFILE(默认),行存储
SequenceFile:二进制键值对序列化存储,行存储
列存储
(5)数据类型:除基本数据类型外(参考mysql),还提供复杂数据类型:数组Array、Map、Struct自定义数据结构存储。(定义与查询参考文件示例)
二、Hive配置安装
Hive中元数据默认存在 derby数据库中,生产中一般用mysql;元数据包括有哪些数据库、数据库中有哪些表、表结构等信息。
安装过程中,需要注意修改hive-sive.xml,配置数据库的基本信息

注意:Hive使用环境变量HADOOP_HOME来制定Hadoop的所有相关JAR和配置文件。 (通过环境变量找到hadoop相关环境和配置),所以安装hive不需要在本身的配置文件中再次Hadoop环境。
三、基本操作
创建数据库:create database name;
创建表:
create table user_info(
user_id string,
area_id string,
age int,
occupation string
)
row format delimited fields terminated by '\t' //存储时字段间以 \t 分隔
lines terminated by '\n'
stored as textfile;
删除表:drop table user_info;
其他内部表、外部表操作见文件示例。
数据库在HDFS中存储路径:hadoop fs -ls /user/hive/warehouse/name.db ;内部表会在该路径生成相应的表级目录文件。
内部表与外部表的区别:存储路径不一样,外部表需要指定存储路径,内部表使用默认路径;删除外部表时,数据再hdfs上还存在,仅删除表元数据信息。删除内部表时,数据再hdfs上也被删除。生产中一般使用外部表。
表中添加数据,常用方式:
(1)使用load从本地加载数据到表student_info:
load data local inpath '/home/hadoop/apps/hive_test_data/student_info_data.txt' into table student_info;
(2) 使用load将hdfs文件加载到student_info表中
load data inpath '/student_info_data.txt' (overwrite )into table student_info;
overwrite into table,以覆盖方式添加
into table,以追加方式添加
(3) insert into table a select * from b;
这个会转化成一个mapreduce任务,提交到yarn上运行,所以需要yarn相关服务起来,这个sql才能执行。
外部表:hdfs直接把数据put到相应目录下,就可以查到了;分区表除外,如果表未分区表,需要手动建立分区,才能查询到数据(alter table student_school_info_external_partition add partition(school_year='2017');
内部表:需要hdfs put 到一个目录下,再用load加载到 默认路径下,才可以select到吧。。。。?
hive导出数据:
hive -e “select **” > ./result.txt
hive 的各种join操作。。
不支持单条数据的更新操作,insert 操作 -> MR
四、高级操作
Hive提供的内置函数若无法满足业务需求,可自定义UDF函数。
步骤见文档。
distribute by,group by ,sorted by, order by 区别。。
网友评论