Bu konu, MaxCompute UDAF ve UDTF'lerinde Resolve ek açıklamasıyla dinamik parametrelerin nasıl kullanılacağını açıklar.
Resolve ek açıklaması için genişletilmiş söz dizimi
MaxCompute'te UDAF ve UDTF'ler, işlevin imzasını belirlemek için Resolve ek açıklamasını kullanır.
@com.aliyun.odps.udf.annotation.Resolve("BIGINT->DOUBLE")
public class UDTFClass extends UDTF {
...
}
Bu örnekte, BIGINT türünde bir giriş parametresi kabul eden ve DOUBLE değeri döndüren bir UDTF tanımlanmaktadır.
MaxCompute, Resolve ek açıklaması söz dizimi için aşağıdaki uzantıları destekler:
-
Giriş parametresi listesinde değişken sayıda ve herhangi bir türde giriş parametresini kabul etmek için
*karakterini kullanabilirsiniz. Örneğin,@Resolve('double,*->String')ifadesi, işlevin ilk giriş parametresi olarak bir DOUBLE değerini, ardından ise herhangi bir türde istenilen sayıda parametreyi kabul ettiğini gösterir. Giriş parametrelerinin sayısını ve türlerini kontrol etmek ve buna göre işlemek için kod yazmanız gerekir. Bu mekanizma, C dilindekiprintfişlevine benzer.NotYıldız işaretinin dönüş değeri listesindeki anlamı farklıdır.
-
Giriş parametresi listesinde herhangi bir türdeki parametreyi temsil etmek için
anyanahtar sözcüğünü kullanabilirsiniz. Örneğin,@Resolve('double,any->string')ifadesi, işlevin ilk giriş parametresi olarak DOUBLE türünde, ikinci giriş parametresi olarak ise herhangi bir türde bir değer kabul ettiğini gösterir.Notanyanahtar sözcüğü, dönüş değeri listesinde veya ARRAY gibi karmaşık türlerin alt türleri için kullanılamaz. -
Bir UDTF'nin dönüş değeri, isteğe bağlı sayıda STRING türü değeri temsil eden bir yıldız işareti (*) olabilir. Dönüş değerlerinin sayısı, işlev çağrılırken belirtilen diğer adların sayısına bağlıdır. Örneğin,
@Resolve("ANY,ANY->DOUBLE,*")ek açıklamasıyla işlevUDTF(x, y) as (a, b, c)şeklinde çağrılırsa,asanahtar sözcüğünden sonra a, b ve c olmak üzere üç diğer ad belirtilmiş olur. Düzenleyici,adeğişkeninin ek açıklamada ilk dönüş değeri olarak belirtilen DOUBLE türünde olduğunu;bvecdeğişkenlerinin ise STRING türünde olduğunu belirler. Üç dönüş değeri belirtildiği için, UDTFforwardyöntemi çağrıldığında uzunluğu 3 olan bir diziyiforwardile iletmelidir. Aksi takdirde çalışma zamanı hatası oluşur.NotBu tür bir hata derleme zamanında tespit edilemez. Bu nedenle, bir UDTF çağrırken SQL sorgunuzdaki diğer adların sayısı, UDTF tarafından döndürülen sütun sayısıyla eşleşmelidir. Bu özellik, her zaman tek bir dönüş değeri olan UDAF'ler için geçerli değildir.
UDTF örneği
import com.aliyun.odps.udf.UDFException;
import com.aliyun.odps.udf.UDTF;
import com.aliyun.odps.udf.annotation.Resolve;
import org.json.JSONException;
import org.json.JSONObject;
@Resolve("STRING,*->STRING,*")
public class JsonTuple extends UDTF {
private Object[] result = null;
@Override
public void process(Object[] input) throws UDFException {
if (result == null) {
result = new Object[input.length];
}
try {
JSONObject obj = new JSONObject((String)input[0]);
for (int i = 1; i < input.length; i++) {
// The variable-length part of the return value must consist of STRING types.
result[i] = String.valueOf(obj.get((String)(input[i])));
}
result[0] = null;
} catch (JSONException ex) {
for (int i = 1; i < result.length; i++) {
result[i] = null;
}
result[0] = ex.getMessage();
}
forward(result);
}
}
Bu UDTF örneğinde, dönüş değerlerinin sayısı giriş parametrelerinin sayısına göre belirlenir. İlk giriş parametresi bir JSON dizesidir, sonraki parametreler ise JSON nesnesinden çıkarılacak anahtarlardır. İlk dönüş değeri, varsa ayrıştırma hatalarını bildirir. Ayrıştırma başarılı olursa bu değer null olur ve sonraki değerler her bir anahtar için çıkarılan içeriği içerir. Aşağıdaki örnekler bu UDTF'nin kullanımını göstermektedir.
-- Customize the number of output aliases based on the number of input parameters.
SELECT my_json_tuple(json, 'a', 'b') as exceptions, a, b FROM jsons;
-- When no JSON fields are to be parsed, expect only the error message column.
SELECT my_json_tuple(json) as exceptions FROM jsons;
-- The following SQL statement causes a runtime error because the number of aliases
-- does not match the actual number of outputs.
-- Note that this error cannot be detected at compile time.
SELECT my_json_tuple(json, 'a', 'b') as exceptions, a, b, c FROM jsons;
Bu konuda açıklanan uzantılar iş gereksinimlerinizi karşılamıyorsa, benzer işlevselliği UDT'ler kullanarak uygulayabilirsiniz. Daha fazla bilgi için bkz. UDT'ye Genel Bakış.
UDAF ve UDTF'ler için Python örnekleri için bkz. Python 3 UDAF ve MaxCompute kaynağını okumak için Python 3 UDTF örneği.