一、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函数的更多相关文章

  1. 大数据入门第七天——MapReduce详解(一)入门与简单示例

    一.概述 1.map-reduce是什么 Hadoop MapReduce is a software framework for easily writing applications which ...

  2. 大数据入门第七天——MapReduce详解(二)切片源码浅析与自定义patition

    一.mapTask并行度的决定机制 1.概述 一个job的map阶段并行度由客户端在提交job时决定 而客户端对map阶段并行度的规划的基本逻辑为: 将待处理数据执行逻辑切片(即按照一个特定切片大小, ...

  3. 大数据入门第十一天——hive详解(一)入门与安装

    一.基本概念 1.什么是hive The Apache Hive ™ data warehouse software facilitates reading, writing, and managin ...

  4. 大数据入门第十一天——hive详解(二)基本操作与分区分桶

    一.基本操作 1.DDL 官网的DDL语法教程:点击查看 建表语句 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data ...

  5. 大数据入门第十六天——流式计算之storm详解(一)入门与集群安装

    一.概述 今天起就正式进入了流式计算.这里先解释一下流式计算的概念 离线计算 离线计算:批量获取数据.批量传输数据.周期性批量计算数据.数据展示 代表技术:Sqoop批量导入数据.HDFS批量存储数据 ...

  6. 大数据入门第八天——MapReduce详解(三)MR的shuffer、combiner与Yarn集群分析

    /mr的combiner /mr的排序 /mr的shuffle /mr与yarn /mr运行模式 /mr实现join /mr全局图 /mr的压缩 今日提纲 一.流量汇总排序的实现 1.需求 对日志数据 ...

  7. 大数据入门第十七天——storm上游数据源 之kafka详解(三)其他问题

    一.kafka文件存储机制 1.topic存储 在Kafka文件存储中,同一个topic下有多个不同partition,每个partition为一个目录,partiton命名规则为topic名称+有序 ...

  8. 大数据入门第十七天——storm上游数据源 之kafka详解(一)入门与集群安装

    一.概述 1.kafka是什么 根据标题可以有个概念:kafka是storm的上游数据源之一,也是一对经典的组合,就像郭德纲和于谦 根据官网:http://kafka.apache.org/intro ...

  9. 大数据入门第十七天——storm上游数据源 之kafka详解(二)常用命令

    一.kafka常用命令 1.创建topic bin/kafka-topics. --replication-factor --zookeeper mini1: // 如果配置了PATH可以省略相关命令 ...

随机推荐

  1. 【转】证书的应用之一 —— TCP&SSL通信实例及协议分析(下)

    原文链接 前面两部分分别讲解了如何在.net程序中使用SSL实现安全通信以及SSL的通信过程,并通过抓包工具具体分析了ssl的握手过程,本文通过一个demo来模拟ssl协议,在TCP之上实现自己的安全 ...

  2. 铁乐学python_day10_作业

    1.继续整理函数相关知识点,写博客. 2.写函数,接收n个数字,求这些参数数字的和.(动态传参) def sum_n(*args): sum = 0 for i in args: sum += i r ...

  3. Matlab绘图——对称曲线绘制(转)

    转自 http://blog.csdn.net/lyqmath/article/details/6004885 目的:对曲线数据做对称绘制 思想:根据两曲线按a对称,则x1 + x2 = 2a的原则 ...

  4. Java基础面试题(进程和线程的区别)

    进程和线程的区别 1.定义 进程:具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程:进程的一个实体,是CPU调度和分派的基本单位,它是比进程更 ...

  5. CORS跨域与Nginx反向代理跨域优劣对比

    最近写了一些关于前后端分离项目之后,跨域相关方案的基本原理和常见误区的帖子,主要包括CORS和Nginx反向代理.这两种方案项目中都有在用,各有优缺,关于具体使用哪种方案,大家的观点也不大一致,本文主 ...

  6. jQuery复制table header到表格的最下面

    为了让table具有更好的可读性,我们可以将表格的header信息克隆一份到表格的底部,这种特效通过JQuery就很容易实现: 1 2 3 4 5 var $tfoot = $(''); $($('t ...

  7. 用python解析word文件(三):style

    太长了,我决定还是拆开三篇写.   (一)段落篇(paragraph) (二)表格篇(table) (三)样式篇(style)(本篇) 选你所需即可.下面开始正文. 在前两篇中,我们已经解析出了par ...

  8. 1692. [USACO07DEC] 队列变换【后缀数组+贪心】

    Description FJ打算带他的N(1 <= N <= 30,000)头奶牛去参加一年一度的“全美农场主大奖赛”.在这场比赛中,每个参赛者都必须让他的奶牛排成一列,然后领她们从裁判席 ...

  9. Day18 (一)类的加载器

    一个运行时的Java虚拟机(JVM)负责运行一个Java程序. 当启动一个Java程序时,一个虚拟机实例诞生:当程序关闭退出,这个虚拟机实例也就随之消亡. 如果在同一台计算机上同时运行多个Java程序 ...

  10. 集合之Map总结

    在前面LZ详细介绍了HashMap.HashTable.TreeMap的实现方法,从数据结构.实现原理.源码分析三个方面进行阐述,对这个三个类应该有了比较清晰的了解,下面LZ就Map做一个简单的总结. ...