Todos os produtos
Search
Central de documentação

MaxCompute:Exemplo: Obter um caractere em uma posição especificada em uma URL

Última atualização: Jun 26, 2026

Este exemplo demonstra como escrever e registrar uma função definida pelo usuário (UDF) em Java ou Python chamada UDF_GET_URL_CHAR, que extrai um segmento de um caminho de URL com base na posição. Utilize esta UDF quando as funções de string nativas do MaxCompute não atenderem à sua lógica de análise de URL.

Como funciona

A função UDF_GET_URL_CHAR recebe uma string de URL e uma posição inteira n e executa as seguintes etapas:

  1. Localiza a primeira ocorrência de .htm na URL.

  2. Extrai o segmento de caminho imediatamente anterior a .htm.

  3. Divide esse segmento por hífen (-).

  4. Retorna o enésimo elemento a partir da direita no array resultante.

Assinatura da função

string UDF_GET_URL_CHAR(string <url>, bigint <n>)

Parâmetro

Tipo

Obrigatório

Descrição

url

STRING

Sim

A URL source a ser analisada

n

BIGINT

Sim

A posição a ser recuperada, contada da direita para a esquerda

Tipo de retorno: STRING.

Comportamento do valor de retorno

Condição

Valor de retorno

A URL não contém .htm

String vazia

n é igual a 0

String vazia

n excede o número de segmentos delimitados por hífen

String vazia

Entrada válida

O enésimo segmento a partir da direita

A função nunca retorna null. Todos os casos extremos retornam uma string vazia.

Pré-requisitos

Antes de começar, verifique se você possui:

  • Um projeto MaxCompute com permissões para criar resources e registrar UDFs

  • O cliente MaxCompute ou DataWorks instalado e configurado

Etapa 1: Escrever a UDF

UDF Java

O método evaluate aceita um objeto String (mapeado para STRING em SQL) e um Long (mapeado para BIGINT em SQL), retornando um String. A classe deve estender com.aliyun.odps.udf.UDF.

package com.aliyun; // The package name, which is user-defined.
import com.aliyun.odps.udf.UDF;

public class GetUrlChar extends UDF {
    public String evaluate(String url, Long n)  {
        if (n == 0) {
            return "";
        }
        try {
            // Find the index of the first occurrence of ".htm" in the URL.
            int index = url.indexOf(".htm");
            if (index < 0)  {
                return "";
            }
            // Extract the prefix up to (but not including) ".htm".
            String a = url.substring(0, index);
            // Find the last forward slash in the prefix.
            index = a.lastIndexOf("/");
            // Extract the segment after the last slash.
            String b = a.substring(index  +  1);
            // Split the segment by hyphen.
            String[] c = b.split("-");
            // Return empty string if n exceeds the number of segments.
            if (c.length  <  n)  {
                return  "";
            }
            // Return the nth element from the right.
            return c[c.length - n.intValue()];
        } catch (Exception e)  {
            return  "Internal error";
        }
    }
}

Para especificações de código e requisitos de classe, consulte UDFs Java.

UDF Python 3

from odps.udf import annotate

@annotate("string,bigint->string")
class GetUrlChar(object):

    def evaluate(self, url, n):
        if n == 0:
            return ""
        try:
            index = url.find(".htm")
            if index < 0:
                return ""
            a = url[:index]
            index = a.rfind("/")
            b = a[index + 1:]
            c = b.split("-")
            if len(c) < n:
                return ""
            return c[-n]
        except Exception:
            return "Internal error"

Projetos MaxCompute executam Python 2 por padrão. Para usar uma UDF Python 3 em uma sessão, execute:

set odps.sql.python.version=cp37;

Para especificações de UDF Python 3, consulte UDFs Python 3.

UDF Python 2

#coding:utf-8
from odps.udf import annotate

@annotate("string,bigint->string")
class GetUrlChar(object):

    def evaluate(self, url, n):
        if n == 0:
            return ""
        try:
            index = url.find(".htm")
            if index < 0:
                return ""
            a = url[:index]
            index = a.rfind("/")
            b = a[index + 1:]
            c = b.split("-")
            if len(c) < n:
                return ""
            return c[-n]
        except Exception:
            return "Internal error"

Caso o código contenha caracteres chineses, adicione uma declaração de codificação no início do arquivo — seja #coding:utf-8 ou # -*- coding: utf-8 -*-. Ambos os formatos são equivalentes.

Para especificações de UDF Python 2, consulte UDFs Python 2.

Etapa 2: Fazer upload e registrar a UDF

Após escrever e testar o código da UDF, faça o upload dele para o MaxCompute como um resource e registre-o com o nome UDF_GET_URL_CHAR.

Etapa 3: Chamar a UDF

Chame a função UDF_GET_URL_CHAR usando uma instrução SQL SELECT. Se você registrou uma UDF Python 3, adicione set odps.sql.python.version=cp37; antes da consulta.

Exemplo 1: URL sem caminho .htm

set odps.sql.python.version=cp37; -- Required only for Python 3 UDFs.
SELECT UDF_GET_URL_CHAR("http://www.taobao.com", 1);

Resultado:

+-----+
| _c0 |
+-----+
|     |
+-----+

Como a URL http://www.taobao.com não contém .htm, a função retorna uma string vazia.

Exemplo 2: URL com caminho de segmento único

SELECT UDF_GET_URL_CHAR("http://www.taobao.com/a.htm", 1);

Resultado:

+-----+
| _c0 |
+-----+
| a   |
+-----+

O segmento anterior a .htm é a. A divisão por hífen resulta em um único elemento; portanto, n=1 a partir da direita retorna a.

Exemplo 3: URL com caminho de múltiplos segmentos

SELECT UDF_GET_URL_CHAR("http://www.taobao.com/a-b-c-d.htm", 3);

Resultado:

+-----+
| _c0 |
+-----+
| b   |
+-----+

O segmento a-b-c-d é dividido em ["a", "b", "c", "d"]. Contando a partir da direita, a posição 3 corresponde a b.