大数据入门第十一天——hive详解(三)hive函数
一、hive函数
1.内置运算符与内置函数
函数分类:
查看函数信息:
DESC FUNCTION concat;
常用的分析函数之rank() row_number(),参考:https://www.cnblogs.com/wujin/p/6051768.html
常用20个内置函数:
https://www.cnblogs.com/kimbo/p/6288516.html
常用函数:https://www.iteblog.com/archives/2258.html
完整参考官方手册:https://www.cnblogs.com/liupengpengg/p/7908274.html
窗口函数推荐教程:http://www.aboutyun.com/thread-22652-1-1.html
结合相关实例:https://blog.csdn.net/dingchangxiu11/article/details/83145151
开窗函数OVER用法介绍:http://blog.csdn.net/sherri_du/article/details/53312085
http://blog.csdn.net/qq_26937525/article/details/54925827
窗口函数理解与实践:http://blog.csdn.net/xiepeifeng/article/details/42676567
窗口函数与分析函数用法:http://www.cnblogs.com/skyEva/p/5730531.html
http://blog.csdn.net/sunnyyoona/article/details/56484919
PARTITON BY 与 ORDER BY语句非常重要:
窗口函数和聚合函数不同的地方在于聚合函数每个分组只产生一条记录,而窗口函数则是每条记录都会生成一条记录
SQL 窗口查询引入了三个新的概念:窗口分区、窗口帧、以及窗口函数。 PARTITION 语句会按照一个或多个指定字段,将查询结果集拆分到不同的 窗口分区 中,并可按照一定规则排序。
如果没有 PARTITION BY,则整个结果集将作为单个窗口分区;
如果没有 ORDER BY,我们则无法定义窗口帧,进而整个分区将作为单个窗口帧进行处理。
行列转换:https://www.cnblogs.com/dongxiucai/p/9784011.html
lateral view的用法参考maxcomputer常用SQL小结
2.自定义函数
分类
UDF 作用于单个数据行,产生一个数据行作为输出。(数学函数,字符串函数)
UDAF(用户定义聚集函数):接收多个输入数据行,并产生一个输出数据行。(count,max)
自定义UDF:
1.新建工程
这里选择IDEA中建立普通的maven工程,如果不使用maven,则导入hive安装包中Lib下除掉php、perl等的jar
2.引入依赖
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>1.2.1</version>
</dependency>
// 推荐保持和hadoop版本一致
3.定义继承于UDF的类,编写evaluate()方法(必须是Public):
public class ToLowerCaseUDF extends UDF { public String evaluate(String src) {
if (src == null) {
return "";
}
return src.toLowerCase();
}
}
若需要添加函数说明,使得可以通过DESC查看,可以添加以下注解(_FUNC_会替换为函数名)
@Description(name = "deprecation",
value = "_FUNC_(date, price) - from the input date string(yyyyMMdd), " +
"returns the deprecation price by computing price and "
+ "the depreciation rate of the second-hand car.",
extended = "Example:\n" +
" > SELECT _FUNC_(date_string, price) FROM src;")
public class TestUDF extends UDF {
4.打成jar包
使用maven的package打包,如果不使用IDEA的打包,可以切换到项目根目录,手动命令打包:
mvn clean package
5.上传jar包
这里就使用rz上传了
6.使用UDF
临时:
不过这个临时函数, 其生命周期和hive的这个交互session保持一致, 一旦退出, 这个临时函数就消失了.
0: jdbc:hive2://localhost:10000> add JAR /home/hadoop/hiveUDF.jar;
// 在hive中上传jar到hive的classpath
create temporary function toprovince as 'com.jiangbei.ToLowerCaseUDF';
//定义一个函数与UDF对应(as后接类的全路径名),这里手误,函数名应该命令为tolowercase
0: jdbc:hive2://localhost:10000> SELECT toprovince("HELLO");
+--------+--+
| _c0 |
+--------+--+
| hello |
+--------+--+
1 row selected (0.613 seconds)
0: jdbc:hive2://localhost:10000>
hive> DROP TEMPORARY FUNCTION IF EXISTS deprecation;
//删除函数
永久:
1. 把自定义函数的jar上传到hdfs中.
hdfs dfs -put lower.jar 'hdfs:///path/to/hive_func';
2. 创建永久函数
hive> create function xxoo_lower as 'test.ql.LowerUDF' using jar 'hdfs:///path/to/hive_func/lower.jar'
3. 验证
hive> select xxoo_lower("Hello World");
hive> show functions;
4.删除
hive> drop function xxoo_lower;
//补充:处理JSON的内置函数:jason:
hive> select
get_json_object(‘{“store”:{“fruit”:\[{"weight":8,"type":"apple"},{"weight":9,"type":"pear"}], “bicycle”:{“price”:19.95,”color”:”red”}}, “email”:”amy@only_for_json_udf_test.net”, “owner”:”amy” } ‘,’$.owner’)
from dual;
3.Transform
Hive的 TRANSFORM 关键字提供了在SQL中调用自写脚本的功能
适合实现Hive中没有的功能又不想写UDF的情况
实例:
CREATE TABLE u_data_new (
movieid INT,
rating INT,
weekday INT,
userid INT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'; add FILE weekday_mapper.py; INSERT OVERWRITE TABLE u_data_new
SELECT
TRANSFORM (movieid, rating, unixtime,userid)
USING 'python weekday_mapper.py'
AS (movieid, rating, weekday,userid)
FROM u_data;
#!/bin/python
import sys
import datetime for line in sys.stdin:
line = line.strip()
movieid, rating, unixtime,userid = line.split('\t')
weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday()
print '\t'.join([movieid, rating, str(weekday),userid])
参考:http://blog.csdn.net/tianjun2012/article/details/64500499
大数据入门第十一天——hive详解(三)hive函数的更多相关文章
- 大数据入门第七天——MapReduce详解(一)入门与简单示例
一.概述 1.map-reduce是什么 Hadoop MapReduce is a software framework for easily writing applications which ...
- 大数据入门第七天——MapReduce详解(二)切片源码浅析与自定义patition
一.mapTask并行度的决定机制 1.概述 一个job的map阶段并行度由客户端在提交job时决定 而客户端对map阶段并行度的规划的基本逻辑为: 将待处理数据执行逻辑切片(即按照一个特定切片大小, ...
- 大数据入门第十一天——hive详解(一)入门与安装
一.基本概念 1.什么是hive The Apache Hive ™ data warehouse software facilitates reading, writing, and managin ...
- 大数据入门第十一天——hive详解(二)基本操作与分区分桶
一.基本操作 1.DDL 官网的DDL语法教程:点击查看 建表语句 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data ...
- 大数据入门第十六天——流式计算之storm详解(一)入门与集群安装
一.概述 今天起就正式进入了流式计算.这里先解释一下流式计算的概念 离线计算 离线计算:批量获取数据.批量传输数据.周期性批量计算数据.数据展示 代表技术:Sqoop批量导入数据.HDFS批量存储数据 ...
- 大数据入门第八天——MapReduce详解(三)MR的shuffer、combiner与Yarn集群分析
/mr的combiner /mr的排序 /mr的shuffle /mr与yarn /mr运行模式 /mr实现join /mr全局图 /mr的压缩 今日提纲 一.流量汇总排序的实现 1.需求 对日志数据 ...
- 大数据入门第十七天——storm上游数据源 之kafka详解(三)其他问题
一.kafka文件存储机制 1.topic存储 在Kafka文件存储中,同一个topic下有多个不同partition,每个partition为一个目录,partiton命名规则为topic名称+有序 ...
- 大数据入门第十七天——storm上游数据源 之kafka详解(一)入门与集群安装
一.概述 1.kafka是什么 根据标题可以有个概念:kafka是storm的上游数据源之一,也是一对经典的组合,就像郭德纲和于谦 根据官网:http://kafka.apache.org/intro ...
- 大数据入门第十七天——storm上游数据源 之kafka详解(二)常用命令
一.kafka常用命令 1.创建topic bin/kafka-topics. --replication-factor --zookeeper mini1: // 如果配置了PATH可以省略相关命令 ...
随机推荐
- Week7——JSON
1.什么是JSON? JSON是JavaScript对象表示法,全称是JavaScript Objec Notation.它是存储和交换文本信息的语法,类似于XML.JSON是轻量级的文本数据交换格式 ...
- 6_1 持久化模型与再次加载_探讨(1)_三种持久化模型加载方式以及import_meta_graph方式加载持久化模型会存在的变量管理命名混淆的问题
笔者提交到gitHub上的问题描述地址是:https://github.com/tensorflow/tensorflow/issues/20140 三种持久化模型加载方式的一个小结论 加载持久化模型 ...
- JavaScript Web 应用最佳实践分析
[编者按]本文作者为 Mathias Schäfer,旨在回顾在客户端大量使用JavaScript 的最佳 Web应用实践.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 对笔者来说,Jav ...
- LeetCode 题解之Plus One
1.题目描述 2.题目分析 从后向前做加法,等于10则进位,否则直接加1 ,返回 digits; 3.代码 vector<int> plusOne(vector<int>&am ...
- 用NSOperation写下载队列
用NSOperation写下载队列 说明 1. 支持缓存机制 2. 图片都是在主线程中加载 3. 文件名用了md5加密 *这东西被人写烂了,但大伙如果对NSOperation不熟悉的话,可以看看本人的 ...
- Spring中的统一异常处理方式
源自:https://segmentfault.com/a/1190000016236188 在具体的SSM项目开发中,由于Controller层为处于请求处理的最顶层,再往上就是框架代码的. 因此, ...
- 北美IT求职攻略
http://www.followmedoit.com/bbs/forum.php?mod=viewthread&tid=19&extra=page%3D1 身在北美,想留下来并能过得 ...
- Python学习---IO的异步[自定义异步IO]
自定义IO异步基础知识: --所有的请求都基于socket实现,一个请求就是一个socket socket.setblocking(False) 不需要阻塞,一个请求完了发送另外一个,会报错,需解决 ...
- 【教程】【FLEX】#006 控件位置的拖动
上一篇笔记学习了怎么从 把一个控件拖放到另外一个控件里面(即 A --> B里面). 而现在呢,则是学习 怎么把 A 拖到另外一个位置. (A -->A位置改变): 先说一下实现的思路( ...
- CF600E:Lomsat gelral(线段树合并)
Description 一棵树有n个结点,每个结点都是一种颜色,每个颜色有一个编号,求树中每个子树的最多的颜色编号的和. Input 第一行一个$n$.第二行$n$个数字是$c[i]$.后面$n-1$ ...