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:
Localiza a primeira ocorrência de
.htmna URL.Extrai o segmento de caminho imediatamente anterior a
.htm.Divide esse segmento por hífen (
-).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 |
|
|
STRING |
Sim |
A URL source a ser analisada |
|
|
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 |
String vazia |
|
|
String vazia |
|
|
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.