本文向您介绍如何应用indexOf()、substring()、lastIndexOf()等字符串处理方法获取URL中指定位置的字符的Java UDF示例。

获取URL中指定位置的字符UDF说明

  • 函数名:UDFGetHtmQianN
  • 功能:获取URL中指定位置的字符
  • 参数说明:

    String UDFGetHtmQianN(String url, Long n)

    • @url:String类型URL
    • @n:Long类型长度值

UDF使用示例

  • 注册函数
    UDFGetHtmQianN.java测试通过后,我们要将其注册函数使用,如下图。

    说明 一个UDF要想发布到服务端供生产使用,要经历 打包 > 上传 > 注册三个步骤。针对此,我们提供了一键发布功能(studio会依次执行mvn clean package,上传jar和注册UDF三个步骤,一次完成)。详细内容请参见打包、上传和注册
  • 使用示例
    成功注册UDF后,执行命令:
    • 示例一
      select udfGetHtmQianNTest("http://www.taobao.com", 1) from dual;
      • 结果:
        +-----+
        | _c0 |
        +-----+
        |     |
        +-----+
        说明 这里的返回结果不为null。
    • 示例二
      select udfGetHtmQianNTest("http://www.taobao.com/a.htm", 1) from dual;
      • 结果:
        +-----+
        | _c0 |
        +-----+
        | a   |
        +-----+
    • 示例三
      select udfGetHtmQianNTest("http://www.taobao.com/a-b-c-d.htm", 3) from dual;
      • 结果:
        +-----+
        | _c0 |
        +-----+
        | b   |
        +-----+

UDF代码示例

  • UDF实现示例
    package com.aliyun.odps.examples.udf// package名称,可以根据您的情况定义
    import com.aliyun.odps.udf.UDF;
    public  class  UDFGetHtmQianN  extends  UDF  {
        public  String  evaluate(String  url,  Long  n)  {
            try  {
                // 是取url字符串中第一次出现.htm时.的索引位置,数值类型为int
                int  index  =  url.indexOf(".htm");
                if  (index  <  0)  {
                    return  "";
                }
                // 从0开始数,其中不包括index位置的字符
                String  a  =  url.substring(0, index);
                // 返回指定字符/在此字符串中最后一次出现处的索引
                index  =  a.lastIndexOf("/");
                // 取得的字符串长度为:a.length() - (index  +  1)
                String  b  =  a.substring(index  +  1, a.length());
                // 用"-"拆分字符串b,获取字符串数组
                String[]  c  =  b.split("-");
                // 此处c.length>=n时,才有返回值
                if  (c.length  <  n)  {
                    return  "";
                }
                if  (n  ==  0)  {
                    return  "";
                }
                // 返回字符串数组中指定下标的字符
                String  d  =  c[c.length  -  n.intValue()];
                return  d;
            }  catch  (Exception  e)  {
                return  "err";
            }
        }
    }
  • UDF单元测试
    package com.aliyun.odps.examples.udf// package名称,可以根据您的情况定义
    import org.junit.Test;
    import static org.junit.Assert.assertEquals;
    public  class  TestUDFGetHtmQianN  {
        private  UDFGetHtmQianN  udf  =  new  UDFGetHtmQianN();
    
        @Test
        public  void  test_url(){
            Long  n  =  1L;
            assertEquals("err",  udf.evaluate(null,  n));
            //  原来抛异常,现返回null
            assertEquals("",  udf.evaluate("",  n));
    
            assertEquals("",  udf.evaluate("http://www.taobao.com",  n));
            assertEquals("a",  udf.evaluate("http://www.taobao.com/a.htm",  n));
            assertEquals("b",  udf.evaluate("http://www.taobao.com/a-b.htm",  n));
        }
    
        @Test
        public  void  test_index(){
            String  url  =  "http://www.taobao.com/a-b-c.htm";
            assertEquals("err",  udf.evaluate(url,  null));
            //  原来抛异常,现返回null
            assertEquals("err",  udf.evaluate(url,  -1L));
            assertEquals("",  udf.evaluate(url,  0L));
    
            assertEquals("c",  udf.evaluate(url,  1L));
            //  原来返回-,  现返回null
            assertEquals("",  udf.evaluate(url,  100L));
        }
    }