Hive 基础你需要掌握这些
HDFS 中一个简单的 Join查询,是否需要撸一大串代码?我只会SQL语句 能不能入坑大数据?这里我们就来聊一聊 Hive。
Hive 是什么?
Hive 是一种数据仓库工具,不提供数据存储(数据还是存储在 HDFS 上),它能让你通过 SQL语句实现 MapReduce 统计。
Hive 是一个SQL解析引擎,是将SQL语句转译成 MapReduce 作业,然后在 Hadoop 平台上运行。
Hive 中的表是纯逻辑表,只有表的元数据,本质就是 Hadoop 的目录或文件。
Hive 一般读多写少,不支持对数据的改写和删除,它没有定义专门的数据格式,需要由用户指定,通常包括三个属性:
- 列分割符,包括:空格、’,’、‘\t’。
- 行分割符,一般为’\n’。
- 读取文件数据的方法。
Hive 上的SQL和传统 SQL区别
HiveQL | SQL | |
---|---|---|
数据存储 | HDFS、Hbase | Local 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 -- 存储的文件格式
;
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;
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 中将 userid 作为key,value 为二元组<表编号,pageid/age>,shuffle 阶段,将相同的key 合并,reduce 输出是将 二元组<表编号,pageid/age>中ageid和age做笛卡尔积。
异常说明
ParseException line 2:0 cannot recognize input near ‘’ ‘’ ‘’
可能分号后面有空格导致的。
最新文章
- Java Native Interface 四--JNI中引用类型
- Lua 排行榜更新
- Spring 中注入 properties 中的值
- hdu 1515 dfs
- java反射机制简介
- 【转】SVN:Android Studio设置忽略文件
- PHP substr截取中文字符出现乱码的问题解疑
- HDOJ--ACMSteps--2.1.8--Leftmost Digit-(取对数,数学)
- 构造函数,This关键字
- 【开发技术】如何查看项目中struts的版本
- 在Tomcat中采用基于表单的安全验证
- python离线安装包
- arcgis desktop 地理编码服务发布
- s3c2410串口笔记
- ReactJS.NET 之 Demo 初探
- LintCode 412: Candy
- C#上传文件处理
- CentOS系统iptables防火墙的启动、停止以及开启关闭端口的操作
- UIAlertView---iOS-Apple苹果官方文档翻译
- Hierarchical Attention Based Semi-supervised Network Representation Learning
热门文章
- 【Selenium专题】元素定位之一简单定位
- Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column &#39;img&#39; at row 1故障
- python web开发——c2 flask框架和flask_script
- jzoj5950
- class字节码结构(一)(字节码结构和字节常量池的结构)
- day 51 随机验证码, 验证登陆 ,以及 装饰器在函数中的应用
- klee 测试一个简单的正则表达式匹配函数
- 在vue-cli建的vue项目中使用sass
- Ubuntu安装PhpStorm并设置快速启动phpstorm
- .Net WEB 程序员需要掌握的技能