Joins:

Inner  joins:

hive> SELECT * FROM sales;

Joe 2

Hank 4

Ali 0

Eve 3

Hank 2

hive> SELECT * FROM things;

2 Tie

4 Coat

3 Hat

1 Scarf

两个表Inner joins:

hive> SELECT sales.*, things.*

> FROM sales JOIN things ON (sales.id =things.id);

Joe 2 2 Tie

Hank 4 4 Coat

Eve 3 3 Hat

Hank 2 2 Tie

只显示匹配id的记录

另一种表达方式:

SELECT sales.*, things.*

FROM sales, things

WHERE sales.id = things.id;

查看SQL查询分配多少个MapReduce job,使用关键字EXPLAIN

EXPLAIN

SELECT sales.*, things.*

FROM sales JOIN things ON (sales.id =things.id);

一个join 分配一个MapReduce job

Outer  joins:

SELECT sales.*, things.*

> FROM sales LEFT OUTER JOIN things ON(sales.id = things.id);

Joe 2 2 Tie

Hank 4 4 Coat

Ali 0 NULL NULL

Eve 3 3 Hat

Hank 2 2 Tie

LEFT OUTER JOIN显示左表的列,右表的列只显示匹配的,不匹配的用null显示。

hive> SELECT sales.*, things.*

> FROM sales RIGHT OUTER JOIN things ON(sales.id = things.id);

Joe 2 2 Tie

Hank 2 2 Tie

Hank 4 4 Coat

Eve 3 3 Hat

NULL NULL 1 Scarf

RIGHT OUTER JOIN显示右表的列,左表的列只显示匹配的,不匹配的用null显示。

hive> SELECT sales.*, things.*

> FROM sales FULL OUTER JOIN things ON(sales.id = things.id);

Ali 0 NULL NULL

NULL NULL 1 Scarf

Hank 2 2 Tie

Joe 2 2 Tie

Eve 3 3 Hat

Hank 4 4 Coat

两个表的列都显示,不匹配的以null填充

Semi  joins:

SELECT *

FROM things

WHERE things.id IN (SELECT id from sales);

也可以替换用下列表达式:

hive> SELECT *

> FROM things LEFT SEMI JOIN sales ON(sales.id = things.id);

2 Tie

4 Coat

3 Hat

LEFT SEMI JOIN有限制右表sales 只能显示在on里,不能再select 表达式里引用sales表。

 

Map  joins

看下面join:

SELECT sales.*, things.*

FROM sales JOIN things ON (sales.id =things.id);

如果一个表足够小可以存在内存里,hive可以加载该表到内存里执每个map 里的join,这就是map join. Map joins 没有reducer,不适合RIGHT、FULL OUTER JOIN

Map joins 可以利用分桶表的好处,使用需要启动优化属性:

SET hive.optimize.bucketmapjoin=true;

子查询:

SELECT station, year, AVG(max_temperature)

FROM (

SELECT station, year, MAX(temperature) ASmax_temperature

FROM records2

WHERE temperature != 9999 AND quality IN(0, 1, 4, 5, 9)

GROUP BY station, year

) mt

GROUP BY station, year;

上面的语句就是子查询,在from后面又一个查询。

视图:

视图是一个虚拟表通过一个select语句实现。

视图定义:

CREATE VIEW valid_records

AS

SELECT *

FROM records2

WHERE temperature <> 9999 AND qualityIN (0, 1, 4, 5, 9);

DESCRIBE EXTENDED view_name 查看视图的详细信息

在第一个视图基础上创建一个视图:求每个位置每年的最大气温。

CREATE VIEW max_temperatures (station,year, max_temperature)

AS

SELECT station, year, MAX(temperature)

FROM valid_records

GROUP BY station, year;

执行查询求平均最大气温:

SELECT station, year, AVG(max_temperature)

FROM max_temperatures

GROUP BY station, year;

视图只能读,不可以通过视图加载或插入数据到基本表

用户自定义函数:

UDF:操作单个数据行,产生单个数据行。

UDAF:操作多个数据行,产生一个数据行。

UDTF:操作一个数据行,产生多个数据行一个表作为输出。

下面是一个列子使用UDTF:

CREATE TABLE arrays (x ARRAY<STRING>)

ROW FORMAT DELIMITED

FIELDS TERMINATED BY '\001'

COLLECTION ITEMS TERMINATED BY '\002';

数据:

a^Bb

c^Bd^Be

通过数据加载命令可以得到:

hive> SELECT * FROM arrays;

["a","b"]

["c","d","e"]

然后将上述的每行数组数据转换成单行String类型数据,如下:

hive> SELECT explode(x) AS y FROM arrays;

a

b

c

d

e

UDTF有一些限制,它们不能使用额外列表达式。

UDF:

一个UDF必须满足以下两个属性:

•一个UDF必须是org.apache.hadoop.hive.ql.exec.UDF的子类。

•一个UDF必须实现至少一个evaluate()方法。

Evaluate不受接口定义,它可能接受任意个参数和任意类型,返回任意类型的值。

使用步骤:

1、打包编写好的UDF  2、注册功能到元数据中并给起个名字

UDF程序:除去字符串两端的空格或者两端指定的字符

package com.hadoop2app.hive;

import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;

/**
 * 除去字符串两端的空格或者两端指定的字符
 *
 * */

public class Strip extends UDF {

	private Text result  = new Text();

	public Text evaluate(Text str) {
		if (str == null) {
		return null;
		}
		result.set(StringUtils.strip(str.toString()));
		return result;
		}

	public Text evaluate(Text str, String stripChars) {
		if (str == null) {
		return null;
		}
		result.set(StringUtils.strip(str.toString(), stripChars));
	    return result;
	}
}

打包:mvn package 或者 eclipse 选项导出 jar 包并将 jar 上传至服务器指定目录:

注册 FUNCTION 在元数据中并起个名字,操作如下 :

添加jar:

hive> add jar /home/jar/Strip.jar;

CREATE FUNCTION strip AS'com.hadoop2app.hive.Strip';

效果图:

一个参数

两个参数

CREATE FUNCTION strip AS'com.hadoopbook.hive.Strip'

USING JAR '/path/to/hive-examples.jar';

在集群中,我们需要将打包的jar上传至HDFS中,USING JAR 后是HDFS的URI。

移除function:

DROP FUNCTION strip;

创建一个在Hive会话期间的FUNCTION,它不持久化到metastore,使用TEMPORARY关键字

ADD JAR /path/to/hive-examples.jar;

CREATE TEMPORARY FUNCTION strip AS'com.hadoopbook.hive.Strip';

在定义UDFs的目录里创建一个.hiverc,在hive  session开始的时候将自动运行。

UDAF:

1.必须是org.apache.hadoop.hive.ql.exec.UDAF的子类

2.必须包含一个或者多个实现了org.apache.hadoop.hive.ql.exec.UDAFEvaluator的静态类

3.一个evaluator,必须实现5个方法

init():初始化

iterate():

terminatePartial():返回中间聚合的结果

merge():

terminate():聚合的结果显示,调用terminate()。

UDAF 程序: 求温度大值

package com.hadoop2app.hive;

import org.apache.hadoop.hive.ql.exec.UDAF;
import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;
import org.apache.hadoop.io.IntWritable;
/**
 *  UDAF:求最大值
 *
 * /

@SuppressWarnings("deprecation")
public class Maximum  extends UDAF {

	public static class MaximumIntUDAFEvaluator implements UDAFEvaluator{

		private IntWritable result;
		@Override
		public void init() {
			result = null;
		}

		public boolean iterate(IntWritable value){
			if(value==null){
				return true;
			}
			if(result==null){
				result = new IntWritable(value.get());
			}else{
				result.set(Math.max(result.get(),value.get()));
			}

			return true;
		}

		public IntWritable terminatePartial(){
			return result;
		}

		public boolean merge(IntWritable other){
			return iterate(other);
		}

	    public IntWritable terminate(){
	       return result;
	    }
	    }

	}

注册方式与 UDF 的注册方式一致,这里求温度的最大值 效果图:

创建FUNCTION:

hive> add jar /home/jar/Maximum.jar;

Added [/home/jar/Maximum.jar] to class path

Added resources: [/home/jar/Maximum.jar]

hive> CREATE TEMPORARY FUNCTION maximum AS 'com.hadoop2app.hive.Maximum';

hive> SELECT maximum(temperature) FROM records;

UDAF处理流程图

Hive数据仓库笔记(三)的更多相关文章

  1. Hive数据仓库笔记(一)

    Hive建表: CREATE TABLE records (year STRING,temperature INT, quality INT) ROW FORMAT DELIMITED FIELDS ...

  2. Hive数据仓库笔记(二)

    分区和桶:   分区:可以提高查询的效率,只扫描固定范围数据,不用全部扫描 CREATE TABLE logs (ts BIGINT, lineSTRING) PARTITIONED BY (dt S ...

  3. hive学习笔记之一:基本数据类型

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  4. Hive数据仓库工具安装

    一.Hive介绍 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单SQL查询功能,SQL语句转换为MapReduce任务进行运行. 优点是可以通过类S ...

  5. 【大数据】Hive学习笔记

    第1章 Hive基本概念 1.1 什么是Hive Hive:由Facebook开源用于解决海量结构化日志的数据统计. Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表, ...

  6. Hive数据仓库你了解了吗

    在工作中我们经常使用的数据库,数据库一般存放的我们系统中常用的数据,一般为百万级别.如果数据量庞大,达到千万级.亿级又需要对他们进行关联运算,该怎么办呢? 前面我们已经介绍了HDFS和MapReduc ...

  7. Hive学习笔记二

    目录 Hive常见属性配置 将本地库文件导入Hive案例 Hive常用交互命令 Hive其他命令操作 参数配置方式 Hive常见属性配置 1.Hive数据仓库位置配置 1)Default数据仓库的最原 ...

  8. hive数据仓库入门到实战及面试

    第一章.hive入门 一.hive入门手册 1.什么是数据仓库 1.1数据仓库概念 对历史数据变化的统计,从而支撑企业的决策.比如:某个商品最近一个月的销量,预判下个月应该销售多少,从而补充多少货源. ...

  9. hive学习笔记之三:内部表和外部表

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

随机推荐

  1. jersey2.26+spring5+jpa一步步搭建restful服务

    前言 首先,为什么想选择Jersey做restful服务呢?我个人比较喜欢它的插件化设计,可以方便的注入自己的全局处理逻辑.再一个就是可以生成wadl描述文件,供查询服务方法.所以在学习spring的 ...

  2. Springmvc 中org.springframework.http.converter.json.MappingJackson2HttpMessageConverter依赖jackson包

    1,问题详情:Spring使用4.3.5.Release版本后 在SpringMvc配置文件中配置json 解析器后出现报错信息 [org.springframework.web.context.Co ...

  3. web项目中js加载慢问题解决思路

    最近使用Echarts地图(版本为echarts2,echarts3目前无法下载地图版). 问题描述:之前使用require形式加载,地图首次加载显示要6-7秒,难以接受. js配置代码如下: < ...

  4. CompletableFuture CompletableFuture.supplyAsync 异常处理

    CompletableFuture 异常处理completeExceptionally可以把异常抛到主线程 /** * User: laizhenwei * Date: 2018-01-30 Time ...

  5. Hadoop序列化与Java序列化

    序列化就是把内存中的对象的状态信息转换成字节序列,以便于存储(持久化)和网络传输 反序列化就是就将收到的字节序列或者是硬盘的持久化数据,转换成内存中的对象. 1.JDK的序列化 只要实现了serial ...

  6. ubuntu常用命令操作

    建立文件夹软链接 ln -s 源文件 目标文件 当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的目录下 ...

  7. linux 运维,代理,acl控制访问

    运维概述:运行 & 维护,Operation & MaintanceIT运维.业务运维.日常管理运维采用相关的方法.手段.技术.制度.流程和文档等,对IT运行环境.IT业务系统和IT运 ...

  8. APACHE服务器出现No input file specified.的完美解决方案

    启用REWRITE的伪静态功能的时候,首页可以访问,而访问内页的时候,就提示:“No input file specified.” 原因在于使用的PHP是fast_cgi模式,而在某些情况下,不能正确 ...

  9. FusionCharts 3D帕累托图

    1.设计3D帕累托图的页面 Pareto3D.html: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN&q ...

  10. 《实战Nginx》读书笔记

    最近今天读了一本书叫做<实战Nginx:取代Apache的高性能Web服务器>,看后对Nginx 了解了不少.但是还有很多地方不是很了解.不过此书可以作为一本参考手册来使用,里面的讲解很详 ...