Hive 基础你需要掌握这些

本文介绍了Hive作为大数据处理工具的作用,它允许用户通过SQL语句进行MapReduce统计。文章详细讲解了Hive的SQL与传统SQL的区别、架构、常用命令、数据类型、存储格式、分区表、桶的概念,以及Join和Group by的操作。通过实例,帮助读者理解Hive如何在Hadoop上执行MapReduce任务。
摘要由CSDN通过智能技术生成

HDFS 中一个简单的 Join查询,是否需要撸一大串代码?我只会SQL语句 能不能入坑大数据?这里我们就来聊一聊 Hive。

Hive 是什么?

Hive 是一种数据仓库工具,不提供数据存储(数据还是存储在 HDFS 上),它能让你通过 SQL语句实现 MapReduce 统计。

Hive 是一个SQL解析引擎,是将SQL语句转译成 MapReduce 作业,然后在 Hadoop 平台上运行。

Hive 中的表是纯逻辑表,只有表的元数据,本质就是 Hadoop 的目录或文件。

hadoop file
warehouse file

Hive 一般读多写少,不支持对数据的改写和删除,它没有定义专门的数据格式,需要由用户指定,通常包括三个属性:

  • 列分割符,包括:空格、’,’、‘\t’。
  • 行分割符,一般为’\n’。
  • 读取文件数据的方法。

Hive 上的SQL和传统 SQL区别

HiveQLSQL
数据存储HDFS、HbaseLocal File System
数据格式用户自定义系统决定
数据更新不支持,支持数据覆盖支持
索引有(0.8之后)
执行MapReduce 计算模型Executor
可扩展性高(UDF、UDAF、UDTF)
数据规模
执行延迟
数据检查读时模式写时模式

Hive 架构

在这里插入图片描述
我们通过 Hive 的 Client(Hive 的命令行工具,JDBC等)向Hive 提交 SQL 命令,如果是创建数据表的数据定义语言(DDL),Hive 通过执行引擎 Driver 将数据表的信息记录在 Metastore 元数据组件中。

如果提交的是查询分析数据的数据查询语句(DQL),Driver 会将该语句提交给自己的编译器 Compiler 进行语法分析、语法解析、语法优化等一系列操作,最后生成 MapReduce 执行计划,然后根据执行计划生成一个 MapReduce 作业,提交给MapReduce 计算框架进行处理。

常用命令

一次执行多条查询语句,可以将这些查询语句保存在后缀为 hql 的文件中,然后通过下面的命令一次执行。

 hive -f XX.hql 

使用 Hive 时,有时需要查看 HDFS,可以在 Hive 命令下,执行dfs 命令,如下:

dfs -ls /

语法梳理

数据类型

Hive 支持两种数据类型:原生类型复合类型。原生类型包括:TINYINT、SMALLINT、INT、BIGINT、BOOLEAN、FLOAT、DOUBLE、STRING、BINARY(0.8以上才可用)、TIMESTAMP(0.8以上才可用)。复合数据类型包括:ARRAY、MAP、STRUCT、UNION。

存储格式

Hive 支持的文件存储格式有

  • textfile(默认格式)
  • sequencefile(二进制格式)
  • refile
  • 自定义格式
一个 student 表的创建实例:
create table student (
name string,
age int,
cource array<string>,
body map<string,float>,
address struct<street:string,city:string,state:string>
)
row format delimited
fields terminated by '\001' --指定列分隔符
--collection items terminated by '\002' -- 指定集合元素间的分割符
--map keys terminated by '\003' -- 指定类型为 map 的字段的键值对分隔符
--lines terminated by '\n' -- 指定行分隔符
--stored as textfile -- 存储的文件格式
;

实践输出-1

Hive 表

外部表

Hive 默认创建的是内部表,外部表创建语句如下:

create external table ...location '/xxx/xx/x'

关键字 external 指定了该表为外部表,location 指明了数据存放在 HDFS 的 ‘/xxx/xx/x’ 目录下。

当要删除外部表时,Hive 会认为没有完全拥有这份数据,只会删除该外部表的元数据信息,而不会删除该表的数据。

分区表

分区表的创建语句如下:

create table ...partitioned by ...

在分区表中,一个 partition 对应表下的一个目录。

桶(Bucket)

Hive 支持对每一个表或分区,进一步分桶,其创建语句示例如下:

create table bucket_user(
id int,
name string 
)
clustered by (id) into 4 buckets;

Bucket 的主要作用包括:数据采样和提升某些查询操作效率。数据采样的语法示例如下:

select * from bucket_user tablesample(bucket 1 out of 2 on id);

tablesample(bucket x out of y) 中y必须是表中总bucket 数的倍数或因子,x表示从哪个bucket 开始抽。例如:表中总bucket 数为32,tablesample(bucket 3 out of 16),表示总共抽取2个(32/16)桶的数据,是第三个bucket 和第19(3+16)个bucket中的数据。

Join 和 Group by

一条常见的SQL语句,按照 MapReduce 编程模型,其 map 和 reduce 端输入和输出分别是什么?我们分析常见的两种:

  • group by
SELECT pageid, age, count(1) FROM pv_users GROUP BY pageid, age;

group_by
pageid, age 形成Key,count(1) 形成value,经过统计后在reduce输出端重新将 key 拆开与value生成三列。

  • join
SELECT pv.pageid, u.age FROM page_view pv JOIN user u ON (pv.userid = u.userid);

join_sql.jpg
join 中将 userid 作为key,value 为二元组<表编号,pageid/age>,shuffle 阶段,将相同的key 合并,reduce 输出是将 二元组<表编号,pageid/age>中ageid和age做笛卡尔积。

异常说明

ParseException line 2:0 cannot recognize input near ‘’ ‘’ ‘’

可能分号后面有空格导致的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值