Hive数据仓库笔记(三)
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数据仓库笔记(三)的更多相关文章
- Hive数据仓库笔记(一)
Hive建表: CREATE TABLE records (year STRING,temperature INT, quality INT) ROW FORMAT DELIMITED FIELDS ...
- Hive数据仓库笔记(二)
分区和桶: 分区:可以提高查询的效率,只扫描固定范围数据,不用全部扫描 CREATE TABLE logs (ts BIGINT, lineSTRING) PARTITIONED BY (dt S ...
- hive学习笔记之一:基本数据类型
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Hive数据仓库工具安装
一.Hive介绍 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单SQL查询功能,SQL语句转换为MapReduce任务进行运行. 优点是可以通过类S ...
- 【大数据】Hive学习笔记
第1章 Hive基本概念 1.1 什么是Hive Hive:由Facebook开源用于解决海量结构化日志的数据统计. Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表, ...
- Hive数据仓库你了解了吗
在工作中我们经常使用的数据库,数据库一般存放的我们系统中常用的数据,一般为百万级别.如果数据量庞大,达到千万级.亿级又需要对他们进行关联运算,该怎么办呢? 前面我们已经介绍了HDFS和MapReduc ...
- Hive学习笔记二
目录 Hive常见属性配置 将本地库文件导入Hive案例 Hive常用交互命令 Hive其他命令操作 参数配置方式 Hive常见属性配置 1.Hive数据仓库位置配置 1)Default数据仓库的最原 ...
- hive数据仓库入门到实战及面试
第一章.hive入门 一.hive入门手册 1.什么是数据仓库 1.1数据仓库概念 对历史数据变化的统计,从而支撑企业的决策.比如:某个商品最近一个月的销量,预判下个月应该销售多少,从而补充多少货源. ...
- hive学习笔记之三:内部表和外部表
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
随机推荐
- bzoj 1188 [HNOI2007]分裂游戏 SG函数 SG定理
[HNOI2007]分裂游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1394 Solved: 847[Submit][Status][Dis ...
- Mysql主从复制_模式之日志点复制
MySQL数据复制的原理 MySQL复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新.删除等等).因此,要进行复制,必须在主服务器上启用二进制日志. 每个从服务器从主服务器接收主服务器已经记 ...
- Java爬虫----有道翻译初步
目标:http://fanyi.youdao.com/ 用爬虫实现翻译功能. 利用f12查看网页Network,可以发现 有关翻译的表单请求通过 http://fanyi.youdao.com/tr ...
- 使用commons-csv简单读写CSV文件
文章首发于我的github博客 需求 客户的开发测试环境将做迁移.因此需要对zookeeper上的重要的数据以CSV文件格式做备份. 本文通过Apache的commons-csv操作CSV文件.官网地 ...
- [Note] Apache Flink 的数据流编程模型
Apache Flink 的数据流编程模型 抽象层次 Flink 为开发流式应用和批式应用设计了不同的抽象层次 状态化的流 抽象层次的最底层是状态化的流,它通过 ProcessFunction 嵌入到 ...
- 安装CentOS7
安装环境:虚拟机*1 使用软件:CentOS7镜像*1 安装过程: 虚拟机配置步骤(主要部分): 1.安装为Linux:CentOS 64位 2.分配1G内存(若需求大可根据实际情况分配) 3.分配4 ...
- 腾讯云+校园扶持计划是bug还是福利
前言 上午突然收到好友的微信消息.打开一看是关于关腾讯云"云+校园扶持计划".仔细看下了意思就是用户可以花360大洋购买腾讯云服务器配置为1核2G,1M带宽的服务器3年.(腾讯 ...
- js基本类型与引用类型,浅拷贝和深拷贝
1. 基本类型: string,number,boolean,null,undefined 2. 引用类型: Function,Array,Object 基本类型:存放在栈内存中的简单数据段,数据大小 ...
- Java兔子问题
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? /** * @Title:Rabbit.java ...
- 【Thinkphp】入口文件和配置文件
一.入口文件 ThinkPHP采用单一入口模式进行项目部署和访问 入口文件代码 <?php define('APP_DEBUG',TRUE);//打开调试模式 在生产环境中应该关闭 define ...