文档章节

Hive学习系列三--语法学习

乔康007
 乔康007
发布于 2016/06/15 11:15
字数 1428
阅读 33
收藏 1

Hive语法学习

1、hive的表分为外部表、分区表和桶

    a、外部表:Hive中的外部表和表很类似,但是其数据不是放在自己表所属的目录中,

    而是存放到别处,这样的好处是如果你要删除这个外部表,该外部表所指向的数据是

    不会被删除的,它只会删除外部表对应的元数据;而如果你要删除表,该表对应的所

    有数据包括元数据都会被删除。
 b、分区:在Hive中,表的每一个分区对应表下的相应目录,所有分区的数据都是存储

    在对应的目录中。比如wyp表有dt和city两个分区,则对应dt=20131218,city=BJ对应表

    的目录为/user/hive/warehouse/dt=20131218/city=BJ,所有属于这个分区的数据都存

    放在这个目录中。
 c、桶:对指定的列计算其hash,根据hash值切分数据,目的是为了并行,每一个桶对

    应一个文件(注意和分区的区别)。比如将wyp表id列分散至16个桶中,首先对id列的

    值计算hash,对应hash值为0和16的数据存储的HDFS目录

    为:/user/hive/warehouse/wyp/part-00000;而hash值为2的数据存储的HDFS 目

    录为:/user/hive/warehouse/wyp/part-00002。

2、SORT BY 只在本机做排序,ORDER BY 全局排序,只有一个Reduce任务

3、Hive支持select查询,

    a) Select * from user; 不执行mapreduce任务

    b) Select count(*) from user; 执行mapreduce任务

    c) Select * from user limit 2; 不执行mapreduce任务

    d) Select * from user sort by user_id desc limit 2; 执行mapreduce任务

    e) 正则列,未成功

    f) Select * from user where user_id=100636执行带条件查询报错

       

        问题追踪,发现是hive-1.1.1的问题https://issues.apache.org/jira/browse/HIVE-12872

        解决方法:将环境变量换成hive-1.2.0,又出现下面问题

        

            表名user在hive-1.2.0中比较特殊,重新建立表user_info后查询成功。

        建表语句:

            Create table user_info(user_id int,cid string,ckid string,username string)

             Row format delimited fields terminated by ‘\t’ lines terminated by ‘\n’;

        加载数据:

                Load data local inpath ‘/opt/data.txt’ into table user_info;

    g) 将查询结果输出到本地目录

            

            执行mapreduce任务

    h) 分组查询(执行mapreduce任务)

                 

    i) 创建表(三个mapreduce任务)

            

    j) 将查询结果输入到另一张表中(mapreduce任务数跟字段数相同)

            

    k) 插入失败,查询的列与表的列数不同

            

    l) 基于Partition的查询

            i. 一般 SELECT 查询会扫描整个表,使用 PARTITIONED BY 子句建表,查询就

            可以利用分区剪枝(input pruning)的特性

            ii. Hive 当前的实现是,只有分区断言出现在离 FROM 子句最近的那个WHERE 

            子句中,才会启用分区剪枝

    m) 加载分区数据 

            i. load data local inpath '/home/hadoop/input/hive/partitions/file1' into table logs 

            partition (dt='2001-01-01',country='GB');

    n) Hive不支持update和delete语句,看下图

            i. Update

                 

            ii. Delete

                 

    o) Hive中insert可以编辑文件来导入数据,update和delete可以重写数据。

    p) Hive中联合查询(执行一个mapreduce任务)

         

    q) Join查询时,需要注意几个关键点

        i. 只支持等值join

            1. SELECT a.* FROM a JOIN b ON (a.id = b.id)

            2. SELECT a.* FROM a JOIN b 

                    ON (a.id = b.id AND a.department = b.department)

        ii. 可以 join 多于 2 个表,例如

            SELECT a.val, b.val, c.val FROM a JOIN b 

                    ON (a.key = b.key1) JOIN c ON (c.key = b.key2)

        iii. 如果join中多个表的 join key 是同一个,则 join 会被转化为单个 map/reduce 任务

        iv. LEFT,RIGHT和FULL OUTER

            例子

                SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON (a.key=b.key)

        v. 如果你想限制 join 的输出,应该在 WHERE 子句中写过滤条件——或是在 join 子

            句中写

            容易混淆的问题是表分区的情况

                SELECT c.val, d.val FROM c LEFT OUTER JOIN d ON (c.key=d.key) 

                WHERE a.ds='2010-07-07' AND b.ds='2010-07-07‘

        vi. •如果 d 表中找不到对应 c 表的记录,d 表的所有列都会列出 NULL,包括 ds 列。

            也就是说,join 会过滤 d 表中不能找到匹配 c 表 join key 的所有记录。这样的话,

            LEFT OUTER 就使得查询结果与 WHERE 子句无关

            解决办法

                SELECT c.val, d.val FROM c LEFT OUTER JOIN d 

                    ON (c.key=d.key AND d.ds='2009-07-07' AND c.ds='2009-07-07')

        vii. LEFT SEMI JOIN

            1. LEFT SEMI JOIN 的限制是, JOIN 子句中右边的表只能在 ON 子句中设置过滤

            条件,在 WHERE 子句、SELECT 子句或其他地方过滤都不行

    r) Hive不支持等值连接(测试hive-1.2.1支持)

        i. SQL中对两表内联可以写成:

            select * from dual a,dual b where a.key = b.key;

        ii. Hive中应为

            select * from dual a join dual b on a.key = b.key; 

            而不是传统的格式:

            SELECT t1.a1 as c1, t2.b1 as c2FROM t1, t2

            WHERE t1.a2 = t2.b2

                 

                

 

    s) 分号字符,hql是以分号结尾,但是,对分号的认识不是很智慧    

                

                 

        解决方法:用分号的ASCII码代替

                

    t) Hive不支持将数据插入现有的表或分区中,(已测试)

            仅支持覆盖重写整个表

            Insert into overwrite table a select * from b;

    u) hive不支持INSERT INTO 表 Values(), UPDATE, DELETE操作(已测试)

    v) hive支持嵌入mapreduce程序,来处理复杂的逻辑

    w) hive支持将转换后的数据直接写入不同的表,还能写入分区、hdfs和本地目录

    x) Hive加载sql文本的方法

        i. ./hive  -f  ‘/opt/test’

            ./hive 进入hive shell,然后,source ‘/opt/test’

                

© 著作权归作者所有

乔康007
粉丝 2
博文 15
码字总数 7726
作品 0
海淀
程序员
私信 提问
hadoop hive hbase 入门学习 (三)

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// hadoop 自学系列 hado......

curiousby
2015/03/12
0
0
玩转大数据系列之Apache Pig高级技能之函数编程(六)

原创不易,转载请务必注明,原创地址,谢谢配合! http://my.oschina.net/u/1027043/blog Pig系列的学习文档,希望对大家有用,感谢关注散仙! Apache Pig的前世今生 Apache Pig如何自定义UDF...

九劫散仙
2015/03/18
112
0
容器Docker学习系列五~命令学习history,save, import

随着我们几篇文章Docker的命令学习,关于Docker本地镜像管理的命令学习已经接近尾声。今天我们就学习下本地镜像管理的最后三个命令history,save, import。当然前面命令没有掌握熟练的同学可以...

LuckQI
2018/08/19
0
0
Hive系列(一)Hive基本概念

一、Hive基本概念 1.1 什么是Hive Hive:由Facebook开源用于解决海量结构化日志的数据统计。 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能...

u012834750
2018/05/29
0
0
大数据教程(11.5)仓库工具hive的实现机制

上一篇文章介绍了hadoop联邦集群的搭建过程。至此,hadoop的整个知识系统就差不多结束了。本篇博客开始,博主将分享数据仓库hive工具的原理以及使用。 一、Hive基本概念 (1)什么是Hive Hive...

em_aaron
01/15
21
0

没有更多内容

加载失败,请刷新页面

加载更多

代理模式之JDK动态代理 — “JDK Dynamic Proxy“

动态代理的原理是什么? 所谓的动态代理,他是一个代理机制,代理机制可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成,通过代理可以有效的让调...

code-ortaerc
48分钟前
4
0
学习记录(day05-标签操作、属性绑定、语句控制、数据绑定、事件绑定、案例用户登录)

[TOC] 1.1.1标签操作v-text&v-html v-text:会把data中绑定的数据值原样输出。 v-html:会把data中值输出,且会自动解析html代码 <!--可以将指定的内容显示到标签体中--><标签 v-text=""></......

庭前云落
今天
7
0
VMware vSphere的两种RDM磁盘

在VMware vSphere vCenter中创建虚拟机时,可以添加一种叫RDM的磁盘。 RDM - Raw Device Mapping,原始设备映射,那么,RDM磁盘是不是就可以称作为“原始设备映射磁盘”呢?这也是一种可以热...

大别阿郎
今天
10
0
【AngularJS学习笔记】02 小杂烩及学习总结

本文转载于:专业的前端网站☞【AngularJS学习笔记】02 小杂烩及学习总结 表格示例 <div ng-app="myApp" ng-controller="customersCtrl"> <table> <tr ng-repeat="x in names | orderBy ......

前端老手
昨天
14
0
Linux 内核的五大创新

在科技行业,创新这个词几乎和革命一样到处泛滥,所以很难将那些夸张的东西与真正令人振奋的东西区分开来。Linux内核被称为创新,但它又被称为现代计算中最大的奇迹,一个微观世界中的庞然大...

阮鹏
昨天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部