我爱编程

Hive

2018-03-16  本文已影响0人  _duangduang

一、基本原理

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 区别。。

上一篇 下一篇

猜你喜欢

热点阅读