第93课:Hive中的内置函数、UDF、UDAF实战

//hive的内置函数

向下取整

hive> select floor(salary) from employeeforhaving;

select log(salary) from employeeforhaving;

取负数

select negative(salary) from employeeforhaving;


UDF 

package com.dt.spark.hive;

import org.apache.hadoop.hive.ql.exec.UDF;

import org.apache.hadoop.io.Text;


public final class HiveUDF extends UDF {

/**

* 在这个方法中实现任意符合业务处理需求的代码,而hive自带的函数没有实现的

* @param s

* @return

*/

  public Text evaluate(final Text s) {

    if (s == null) { return null; }

    return new Text(s.toString().toLowerCase());

  }

}

打包

 lowerCase.jar

加到上下文:

hive> Add jar /bigdata/learn_data/lowerCase.jar;

Added [/bigdata/learn_data/lowerCase.jar] to class path

Added resources: [/bigdata/learn_data/lowerCase.jar]


//起别名

hive> CREATE TEMPORARY FUNCTION tolower AS ‘com.dt.spark.hive.HiveUDF';

//接下来直接使用:

hive> select tolower(address) from employeeforhaving;


UDAF

聚合操作就可以迭代多次


package com.dt.spark.hive;


import org.apache.hadoop.hive.ql.exec.UDAF;

import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;

/**

 * 多行字符串拼接为一行函数

 * @author jiudu

 */

public class HiveUDAF extends UDAF {

public static class ConcatUDAFEvaluator implements UDAFEvaluator {

public static class PartialResult {

String result;

String delimiter;

}


private PartialResult partial;

/**

* 用于初始化工作,例如用于设置全局变量的初始状态

*/

public void init() {

partial = null;

}

/**

* 是数据迭代的处理的核心

* @param value

* @param deli

* @return

*/

public boolean iterate(String value, String deli) {


if (value == null) {

return true;

}

if (partial == null) {

partial = new PartialResult();

partial.result = new String("");

if (deli == null || deli.equals("")) {

partial.delimiter = new String(",");

} else {

partial.delimiter = new String(deli);

}


}

if (partial.result.length() > 0) {

partial.result = partial.result.concat(partial.delimiter);

}


partial.result = partial.result.concat(value);


return true;

}


/**

* 分布式计算有很多Mapper会把自己的计算结构传给Reducer,如果说Mapper

* 可以继续计算就会调用terminatePartial来更新当前对象的状态

* @return

*/

public PartialResult terminatePartial() {

return partial;

}


/**

* 在Reducer端负责处理Mapper端传过来的参数,其传入的参数的类型是terminatePartial的返回的类型

* @param other

* @return

*/

public boolean merge(PartialResult other) {

if (other == null) {

return true;

}

if (partial == null) {

partial = new PartialResult();

partial.result = new String(other.result);

partial.delimiter = new String(other.delimiter);

} else {

if (partial.result.length() > 0) {

partial.result = partial.result.concat(partial.delimiter);

}

partial.result = partial.result.concat(other.result);

}

return true;

}

/**

* Hive 的UDAF最终返回的聚合结果

* @return

*/

public String terminate() {

return new String(partial.result);

}

}

}

打成pinjie.jar

hive> add jar /bigdata/learn_data/pinjie.jar;

hive> CREATE TEMPORARY FUNCTION pinjie AS 'com.dt.spark.hive.HiveUDAF';

hive> select pinjie(name,"111") from employeeforhaving;




Hive的函数分为三类:UDF(User-Defined Function)、UDAF(User-Defined Aggregate Function)和UDTF(User-Defined Table Function)。 UDF是用户自定义的函数,作用于单个数据行,并生成一个数据行作为输出。UDF可以是数学函数或字符串函数等。 UDAF是用户自定义的聚合函数,可以对一组数据进行聚合操作,例如求和、平均值等。UDAF接收多个数据行作为输入,并生成一个数据行作为输出。 UDTF是用户自定义的表格生成函数,它接收一行输入,并输出多行数据,通常是通过将输入行拆分成多行来实现。UDTF类似于explode操作,可以将一行数据拆分成多行数据。 举例来说,如果我们有一个包含姓名和兴趣爱好的表格,我们可以编写一个UDTF函数,将每个人的兴趣爱好拆分成多行,以便进行进一步的分析和处理。 总结起来,UDF用于单行数据的处理,UDAF用于多行数据的聚合,而UDTF用于将单行数据拆分为多行数据。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [HIVE udfudaf、udtf函数定义与用法(最全!!!!!)](https://blog.csdn.net/sinat_30316741/article/details/113753651)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [spark-hive-udf:Spark Hive UDF示例](https://download.csdn.net/download/weixin_42151305/16809526)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值