Hive基础语法

1、创建表 – 用户表

CREATE [EXTERNAL外部表] TABLE [IF NOT EXISTS 是否存在] HUserInfo (
userid int comment ‘用户Id’,
username string comment ‘用户名称’,
userpwd string comment ‘用户密码’,
createtime string comment ‘创建时间’
)
comment ‘用户信息表’
row format delimited fileds terminated by ‘\t’ -- 声明文件行分隔符
partitioned by (ds string comment '当前时间,用于分区字段') --表示按什么字段进行分割,通常来说是按时间。用于增加分区
clustered by userid --要排序的字段
sorted by username into 32 buckets -- bucket(桶)排,序这里表示将id按照name进行排序,聚类汇总,然后分区划分到32个散列桶中。
stored as rcfile

hive目前支持三种方式:

1)就是最普通的textfile,数据不做压缩,磁盘开销大,解析开销也大

2)SquenceFIle,hadoop api提供的一种二进制API方式,其具有使用方便、可分割、可压缩等特点。

3)rcfile行列存储结合的方式,它会首先将数据进行分块,保证同一个record在一个分块上,避免读一次记录需要读多个块。其次块数据列式存储,便于数据存储和快速的列存取。RCFILE由于采用是的列式存储,所以加载时候开销较大,但具有很好的查询响应、较好的压缩比。

location '/user/hive/test';  --改变表在hdfs中的位置,可不必先创建。

like Old_UserInfo  --复制一个空表,允许用户复制现有的表结构,但是不复制数据。

2、mysql日期函数:sysdate()

3、ODS与EDW的关系

EDW主要为企业提供分析决策服务。时效:T+1

ODS主要实现企业数据整合、共享和准实时运营监控等功能。时效:实时

ODS是EDW的一个有益的补充和扩展。

生产系统中的运营数据通过ETL(抽取、转换、装载)过程进人到ODS中,生产系统之间准实时的数据交换由ODS系统完成,ODS系统同时还将整合好的生产系统下的运营数据通过ETL等方式传送到EDW中,完成运营数据从操作环境进人到分析环境的过程。

ODS作用:

1)对运营数据进行清理整合,提高运营数据质量,是EDW的一个主要数据来源。

2)实现跨系统的近实时报表和查询统计应用。ODS从不同的运营应用系统中采集数据,整合各个系统的共享交易数据,形成企业级数据的整体视图。

3)作为其他生产系统的数据同步源。

4、Hive分区(partition)简介

1)在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作。有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念。

2)分区表指的是在创建表时指定的partition的分区空间。

3)如果需要创建有分区的表,需要在create表的时候调用可选参数partitioned by,详见表创建的语法结构。

4)一个表可以拥有一个或者多个分区,每个分区以文件夹的形式单独存在表文件夹的目录下。

5、Map-side Join和Reduce-side Join的使用场景

1)Map-side Join使用场景是一个大表和一个小表的连接操作,其中,“小表”是指文件足够小,可以加载到内存中。该算法可以将join算子执行在Map端,无需经历shuffle和reduce等阶段,因此效率非常高。

2)Reduce-side Join当两个文件/目录中的数据非常大,难以将某一个存放到内存中时,Reduce-side Join是一种解决思路。该算法需要通过Map和Reduce两个阶段完成,在Map阶段,将key相同的记录划分给同一个Reduce Task(需标记每条记录的来源,便于在Reduce阶段合并),在Reduce阶段,对key相同的进行合并。

6、cast 类型转化

select cast(20 ad double) from hive;

7、Hive建表:一个表可以拥有一个或多个分区,每个分区以文件夹的形式单独存在表文件夹的目录下。

8、Hive的优化思想:

1)尽早尽量过滤数据,减少每个阶段的数据量

2)减少job数

3)解决数据倾斜问题

9、列裁剪:HQL优化方式及使用技巧:只选择真实需要的列。

分区裁剪:HQL优化方式及使用技巧:减少不必要的分区。

10、利用hive 的优化机制减少JOB数:

HQL优化方式及使用技巧:不论是外关联outer join还是内关联inner join,如果Join的key相同,不管有多少个表,都会合并为一个MapReduce任务。

SELECT a.val, b.val, c.valFROM a JOIN b ON (a.key= b.key1) JOIN c ON (c.key= b.key1 ) -> 1个JOB

SELECT a.val, b.val, c.valFROM a JOIN b ON (a.key= b.key1) JOIN c ON (c.key= b.key2) -> 2个JOB

11、JOB输入输出优化:

HQL优化方式及使用技巧:善用muti-insert、union all,不同表的union all相当于multiple inputs,同一个表的union all,相当map一次输出多条。

insert overwrite table tmp1
select ... from a where 条件1;
insert overwrite table tmp2
select ... from a where 条件2;
from a
insert overwrite table tmp1
select ... where 条件1
insert overwrite table tmp2
select ... where 条件2;

12、Local Model:

Select user,itemfrom order_tablelimit 10;
Select * from order_tablelimit 10; (不会生成mapreduce程序)

13、HQL优化方式及使用技巧:避免笛卡尔积

14、数据过滤:HQL优化方式及使用技巧:在JOIN前过滤掉不需要的数据

15、小表放前大表放后原则:

HQL优化方式及使用技巧:在编写带有join操作的代码语句时,应该将条目少的表/子查询放在Join操作符的左边。因为在Reduce 阶段,位于Join 操作符左边的表的内容会被加载进内存,载入条目较少的表可以有效减少OOM(out of memory)即内存溢出。所以对于同一个key来说,对应的value值小的放前,大的放后。

16、Mapjoin():

HQL优化方式及使用技巧:当小表与大表JOIN时,采用mapjoin,即在map端完成。同时也可以避免小表与大表JOIN 产生的数据倾斜。

17、LEFT SEMI JOIN :

HQL优化方式及使用技巧:LEFT SEMI JOIN 是IN/EXISTS 子查询的一种更高效的实现,0.13版本以前不支持IN/EXISTS。

18、LEFT SEMI JOIN :

HQL优化方式及使用技巧

限制条件:只能在ON 子句中设置过滤条件,在WHERE子句、SELECT 子句或其他地方过滤都不行。

Left semi join 与JOIN 的区别:B表有重复值的情况下left semi join 产生一条,join 会产生多条。

19、输入输出优化:合理使用动态分区

20、输入输出优化:union all 优化

HQL优化方式及使用技巧:利用hive对UNION ALL的优化的特性(0.13版本可以直接union)hive对union all优化只局限于非嵌套查询。

21、输入输出优化:合理使用union all

HQL优化方式及使用技巧:不同表太多的union ALL,不推荐使用;通常采用建临时分区表,将不同表的结果insert到不同的分区(可并行),最后再统一处理。

22、输入输出优化:合理使用UDTF

HQL优化方式及使用技巧:select col1,col2,newCol from myTableLATERAL VIEW explode(myCol) adTableAS newCol

说明:执行过程相当于单独执行了两次读取,然后union到一个表里,但JOB数只有一个。

同样myCol也需要为数组类型,但日常中我们多数情况下是string 类型经过split 函数拆分后获取数组类型。

23、输入输出优化:多粒度计算优化

HQL优化方式及使用技巧:应用UDTF 优化:按不同维度进行订单汇总。

select * from (
select ‘1',province,sum(sales) from order_tablegroup by province
union all
select ‘2',city,sum(sales) from order_tablegroup by city
Union all
select ‘3',county,sum(sales) from order_tablegroup by county
) df

24、数据去重与排序:DISTINCT 与GROUP BY

HQL优化方式及使用技巧:尽量避免使用DISTINCT 进行排重,特别是大表操作,用GROUP BY 代替。

25、数据去重与排序:排序优化

HQL优化方式及使用技巧:只有order by 产生的结果是全局有序的,可以根据实际场景进行选择排序。

1)Order by 实现全局排序,一个reduce实现,由于不能并发执行,所以效率偏低,适用于数据量小的场景。

2)Distribute by:控制着在map端如何分区,按照什么字段进行分区,控制map端的均衡分配。

3)Sort by 实现部分有序,每个reduce按照sort by 字段进行排序,每个reduce输出的结果是有序的,效率高,通常和DISTRIBUTE BY关键字一起使用(DISTRIBUTE BY关键字可以指定map 到reduce端的分发key)

例如:distribute by total_sale sort by total_sale desc

4)CLUSTER BY col1 等价于DISTRIBUTE BY col1 SORT BY col1 但不能指定排序规则。

26、数据倾斜:

HQL优化方式及使用技巧:任务进度长时间维持在99%(或100%),查看任务监控页面,发现只有少量(1个或几个)reduce子任务未完成。因为其处理的数据量和其他reduce差异过大。单一reduce的记录数与平均记录数差异过大,通常可能达到3倍甚至更多。最长时长远大于平均时长。

27、Hive有用的新特性:

1)指定列之间的分隔符可以用下面的命令实现:

hive> insert overwrite local directory /home/dd_edw/documents/result'
hive> row format delimited
hive> fields terminated by '\t'
hive> select * from test;

2)group by 语法增强,group by除了可以跟column alias,也可以跟column position

比如:

select f1(col1), f2(col2), f3(col3), count(1) \
group by f1(col1), f2(col2), f3(col3);

可以写成

select f1(col1), f2(col2), f3(col3), count(1) group by 1, 2, 3;

3)ALTER VIEW view_nameAS select_statement

4)SHOW CREATE TABLE ([db_name.]table_name|view_name)

5)Explain dependency 语法, 获取input table和input partition

6)实现了TRUNCATE,可以删除HDFS上面相关表格存储的数据,但是

会保持表和metadata的完整性。

28、Hive建库使用RCFile格式,反正就是高效,Facebook再用。

29、基于java的框架:数据库mysql mongodb redis,持久层ibatis,框架springMVC+spring/Autofac,

表现层JDF JQ velocity。

30、Hive动态分区设置:set hive.exec.dynamic.partition.mode=nonstrict;

31、python分析常用的模块:numpy, pandas, matplotlib, scipy

32、mapjoin解决数据倾斜

使用场景:语句中B表有30亿行记录,A表只有100行记录,而且B表中数据倾斜特别严重,有一个key上有15亿行记录,在运行过程中特别的慢,而且在reduece的过程中遇有内存不够而报错。

SELECT /*+ MAPJOIN(b) */ a.key,  a.value  FROM a join b on a.key = b.key

33、LEFT SEMI JOIN 是IN/EXISTS 子查询的一种更高效的实现

1)通过left outer join 实现in 查询

select a.key, a.value from a left outer join b on a.key=b.keywhere b.keyis not null

2)通过left semi join 实现in

SELECT a.key, a.value FROM a LEFT SEMI JOIN b on (a.key= b.key)

注:限制条件只能在ON 子句中设置过滤条件,在WHERE子句、SELECT 子句或其他地方过滤都不行。

Left semi join 与JOIN 的区别:B表有重复值的情况下left semi join 产生一条,join 会产生多条。

34、hive explode函数

——行转列

35、Hive表还有一个TBLPROPERTIES用来给表添加一些描述信息,比如最后一次修改信息,最后一个修改人。

如:TBLPROPERTIES ('creator'='zhoumei', 'created_at'='2012-01-02 10:00:00')

36、Hive distribute by sorl by order by 的区别:

distribute by:控制着在map端如何分区,按照什么字段进行分区,要注意均衡。

sort by:每个reduce按照sort by 字段进行排序,reduce的数量按照默认的数量来进行,当然可以指定。

最终可以进行归并排序得出结果。

适用于数据量比较大的排序场景。

order by:reduce只有一个,在一个reduce中完成排序,使用于数据量小的场景。

Hive学习笔记:基础语法的更多相关文章

  1. JavaScript学习笔记-基础语法、类型、变量

    基础语法.类型.变量   非数字值的判断方法:(因为Infinity和NaN他们不等于任何值,包括自身) 1.用x != x ,当x为NaN时才返回true; 2.用isNaN(x) ,当x为NaN或 ...

  2. Arduino—学习笔记—基础语法

    图解 函数具体讲解 pinMode(工作接脚,模式) 工作接脚 工作接脚编号(0--13与A0--A5) 模式 工作模式:INPUT或OUTPUT 例子 将8接口设置为输出模式 pinMode(8,O ...

  3. Java学习笔记-基础语法

    Java基础包含关键字,标识符,注释,常量和变量,运算符 关键字 关键字的定义和特点 定义:被Java语言赋予了特殊含义的单词 特点:关键字中所有字母都为小写 Java的关键字 用于定义数据类型的关键 ...

  4. Python学习笔记——基础语法篇

    一.Python初识(IDE环境及基本语法,Spyder快捷方式) Python是一种解释型.面向对象.动态数据类型的高级程序设计语言,没有编译过程,可移植,可嵌入,可扩展. IDE 1.检查Pyth ...

  5. Java学习笔记-基础语法Ⅹ-进程线程

    学习快一个月了,现在学到了黑马Java教程的300集 打印流的特点: 只负责输出数据,不负责读取数据 有自己的特有方法 字节打印流:PrintStream,使用指定的文件名创建新的打印流 import ...

  6. Java学习笔记-基础语法Ⅷ-泛型、Map

    泛型 泛型本质上是参数化类型,也就是说所操作的数据类型被指定为一个参数,即将类型由原来的具体的类型参数化,然后在使用/调用时传入具体的类型,这种参数类型可以用在类.方法和接口中,分别为泛型类.泛型方法 ...

  7. Java学习笔记-基础语法Ⅴ

    学习一些Java常用的API Math:包含执行基本数字运算的方法 如果没有构造方法,一般类的成员都是静态的,通过类名可以直接调用 Java中有两种random函数,Math.Random()函数能够 ...

  8. Java学习笔记-基础语法Ⅳ

    多态:同一个对象,在不同时刻表现出来的不同形态 例如: 猫 cat = new 猫(); 动物 animal = new 猫(); 这里的猫在不同时刻表现出来不同的形态,这就是多态 多态的前提和体现: ...

  9. python学习笔记--基础语法

    等待用户输入 #!/usr/bin/python raw_input("\n\nPress the enter key to exit.") 简单的判断 #!/usr/bin/py ...

  10. JAVA 学习笔记 - 基础语法 2

    ---恢复内容开始--- 1.数组的申明和应用 数据类型 数组名称[] = null;             //在堆栈中申明变量名称 数组名称 =  new  数据类型[10];       // ...

随机推荐

  1. 题目1452:搬寝室(dp题目)

    题目链接:http://ac.jobdu.com/problem.php?pid=1452 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...

  2. ftp主动与被动模式区别

    FTP是仅基于TCP的服务,不支持UDP.与众不同的是FTP使用2个端口,一个数据端口和一个命令端口(也可叫做控制端口).通常来说这两个端口是21(命令端口)和20(数据端口).但FTP工作方式的不同 ...

  3. C语言如何产生随机数

    1.基本函数 在C语言中取随机数所需要的函数是: int rand(void); void srand(unsigned int n); rand()函数和srand()函数被声明在头文件stdlib ...

  4. Egret 中实现3种状态切换按钮

    一.游戏中的常用3种状态按钮 Egret种提供了2种状态切换的按钮ToggleButton. 但是在游戏中常用到3种状态的按钮,比如任务系统的领取.已领取.未领取. 比如下图中宝箱的打开.浏览后打开. ...

  5. MFC创建好的对话框如何移植到新程序中

    1.用文本文件打开需要移植对话框工程中的rc文件 2.在RC文件夹中找到需要移植的对话框内容,然后拷贝到新的工程的rc文件中 3.在原有工程的rsource.h中所有和这个对话框有关的ID都拷贝到新的 ...

  6. C# XML对象序列化、反序列化

    XML 序列化:可以将对象序列化为XML文件,或者将XML文件反序列化为对象还有种方法使用LINQ TO XML或者反序列化的方法从XML中读取数据. 最简单的方法就是.net framework提供 ...

  7. Ubuntu 16.04系统下开机提示“无法应用原保存的显示器配置”

    开机启动Ubuntu时,提示以下错误,部分截图如图: 解决方法: 按住Ctrl+Alt+T开启终端,输入rm .config/monitors.xml,回车,然后重启Ubuntu即可解决:如图

  8. python---不支持中文注释解决办法

    很神奇的一件事儿,pycharm不支持中文注释,具体解决办法: #-*- coding: utf- -*- 具体使用:

  9. Python中常用包——sklearn主要模块和基本使用方法

    在从事数据科学的人中,最常用的工具就是R和Python了,每个工具都有其利弊,但是Python在各方面都相对胜出一些,这是因为scikit-learn库实现了很多机器学习算法. 加载数据(Data L ...

  10. Windows 10 下 PostgreSQL 生成 UUID(Guid)

    最近在Windows 10 下安装了 PostgreSQL(postgresql-9.6.3-1-windows.exe),在学习过程中,发现PostgreSQL 支持UUID(Guid)类型,但是却 ...