hive/spark-sql使用自定义函数解决sql不能解决的情况

package com.mingzhi;

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

/**
 * 计算客户评价,回访,审核评价星级
 */
public class GetStar extends UDF {


    /**
     * values:AUDIT_ORDER:3|RETURN_VISIT:5|EVALUATE_ORDER:5
     * concat()函数只要一个参数为null,返回的值就是null
     * @param s AUDIT_ORDER->AUDIT_ORDER:3|RETURN_VISIT:5|EVALUATE_ORDER:5
     * @return
     */
    public String evaluate(final String s) {

        if (StringUtils.isEmpty(s)) {
            return "-1";
        }

        int audit_order_star = 0;
        int revisit_star = 0;
        int evaluate_order_star = 0;

        String[] kv = s.split("->");

        if (kv.length==1){
            return "-1";
        }

        if (StringUtils.isEmpty(kv[1])) {
            return "-1";
        }

        for (String s1 : kv[1].split("\\|")) {

            String[] typeStar = s1.split(":");

            if (s1.contains("AUDIT_ORDER")) {

                if (!StringUtils.isEmpty(typeStar[1])) {
                    audit_order_star = Integer.parseInt(typeStar[1]);
                }


            } else if (s1.contains("RETURN_VISIT")) {
                if (!StringUtils.isEmpty(typeStar[1])) {
                    revisit_star = Integer.parseInt(typeStar[1]);
                }
            } else if (s1.contains("EVALUATE_ORDER")) {
                if (!StringUtils.isEmpty(typeStar[1])) {
                    evaluate_order_star = Integer.parseInt(typeStar[1]);
                }
            }

        }


        switch (kv[0]) {
            case "AUDIT_ORDER":
                return audit_order_star + "";
            case "RETURN_VISIT":
                return revisit_star + "";

            case "EVALUATE_ORDER":
                return evaluate_order_star + "";

        }
        return "";

    }
}



使用

add jar /root/jars/udf-1.0-SNAPSHOT-jar-with-dependencies.jar

create temporary function get_star as "com.mingzhi.GetStar"

drop temporary function if exists get_star

select get_star('RETURN_VISIT->AUDIT_ORDER:3|RETURN_VISIT:5|EVALUATE_ORDER:5') from dwd_order_basic

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值