Topik ini menjelaskan cara menggunakan fungsi Java UDF atau Python UDF untuk mendapatkan nilai yang sesuai dengan kunci tertentu dalam string pasangan kunci-nilai. Kunci atau nilai tersebut dipisahkan oleh pemisah.
Deskripsi
Dalam contoh ini, sebuah UDF bernama UDF_EXTRACT_KEY_VALUE_WITH_SPLIT telah didaftarkan. Bagian berikut menjelaskan sintaksis fungsi dan parameter input.
string UDF_EXTRACT_KEY_VALUE_WITH_SPLIT(string <s>, string <split1>, string <split2>, string <keyname>)Deskripsi Fungsi: Fungsi ini menggunakan pemisah yang ditentukan oleh split1 untuk mendapatkan pasangan kunci-nilai dari string yang ditentukan oleh s, serta menggunakan pemisah yang ditentukan oleh split2 untuk memisahkan kunci dan nilai. Kemudian, nilai yang sesuai dengan kunci yang ditentukan oleh keyname dikembalikan. Berbeda dengan UDF yang digunakan untuk mendapatkan nilai dari string tanpa pemisah, UDF ini berlaku untuk string yang memiliki pemisah di kunci atau nilai.
Parameter:
s: String yang ingin Anda pisahkan, bertipe STRING. Parameter ini wajib.
split1: Pemisah string yang digunakan untuk mendapatkan pasangan kunci-nilai, bertipe STRING. Parameter ini wajib.
split2: Pemisah kunci/nilai yang digunakan untuk mendapatkan kunci dan nilai, bertipe STRING. Parameter ini wajib.
keyname: Kunci yang nilainya ingin Anda dapatkan, bertipe STRING. Parameter ini wajib.
Prosedur pengembangan dan penggunaan
1. Menulis UDF
Kode contoh UDF Java
package com.aliyun.rewrite; // Nama paket, yang ditentukan pengguna.
import com.aliyun.odps.udf.UDF;
public class ExtractKeyValueWithSplit extends UDF{
/**
* Gunakan split1 untuk memisahkan string dan mendapatkan pasangan kunci-nilai. Kemudian, gunakan split2 untuk memisahkan pasangan kunci-nilai dan mendapatkan kunci dan nilai.
* @param str String sumber.
* @param split1 Pemisah yang digunakan untuk memisahkan string dan mendapatkan pasangan kunci-nilai.
* @param split2 Pemisah yang digunakan untuk memisahkan pasangan kunci-nilai dan mendapatkan kunci dan nilai.
* @param keyname Nama kunci yang nilainya ingin Anda dapatkan.
* @return Nilai yang dikembalikan.
*/
public String evaluate(String str, String split1, String split2, String keyname) {
if(str==null || split1==null || split2==null || keyname==null){
return null;
}
try {
// Gabungkan keyname dan split2.
String keySplit = keyname + split2;
// Telusuri string. Gunakan split1 untuk memisahkan string dan mendapatkan pasangan kunci-nilai.
for(String subStr: str.split(split1)){
// Gunakan split2 untuk memisahkan pasangan kunci-nilai dan mendapatkan kunci dan nilai. Kemudian, dapatkan nilai yang sesuai dengan kunci tertentu.
if (subStr.startsWith(keySplit)){
return subStr.substring(keySplit.length());
}
}
} catch (Exception e) {
return null;
}
return null;
}
}
Jika Anda menulis UDF Java, Anda harus mewarisi kelas UDF. Dalam contoh ini, metode evaluate mendefinisikan empat parameter input bertipe STRING dan nilai balik bertipe STRING. Tipe data dari parameter input dan nilai balik digunakan sebagai tanda tangan fungsi UDF dalam pernyataan SQL. Untuk informasi lebih lanjut tentang spesifikasi kode lainnya dan persyaratan, lihat Java UDFs.
Kode contoh UDF Python 3
from odps.udf import annotate
@annotate("string,string,string,string->string")
class ExtractKeyValueWithSplit(object):
def evaluate(self, s, split1, split2, keyname):
if not s:
return None
key_split = keyname + split2
# Telusuri string. Gunakan split1 untuk memisahkan string dan mendapatkan pasangan kunci-nilai.
for subStr in s.split(split1):
# Gunakan split2 untuk memisahkan pasangan kunci-nilai dan mendapatkan kunci dan nilai. Kemudian, dapatkan nilai yang sesuai dengan kunci tertentu.
if subStr.startswith(key_split):
return subStr[len(key_split):]Secara default, Python 2 digunakan untuk menjalankan UDF dalam proyek MaxCompute. Jika Anda ingin menjalankan UDF dalam Python 3, jalankan perintah berikut pada tingkat sesi: set odps.sql.python.version=cp37. Untuk informasi lebih lanjut tentang spesifikasi Python 3 UDF, lihat Python 3 UDFs.
Kode contoh UDF Python 2
#coding:utf-8
from odps.udf import annotate
@annotate("string,string,string,string->string")
class ExtractKeyValueWithSplit(object):
def evaluate(self, s, split1, split2, keyname):
if not s:
return None
key_split = keyname + split2
# Telusuri string. Gunakan split1 untuk memisahkan string dan mendapatkan pasangan kunci-nilai.
for subStr in s.split(split1):
# Gunakan split2 untuk memisahkan pasangan kunci-nilai dan mendapatkan kunci dan nilai. Kemudian, dapatkan nilai yang sesuai dengan kunci tertentu.
if subStr.startswith(key_split):
return subStr[len(key_split):]Jika karakter Cina muncul dalam kode UDF yang ditulis dalam Python 2, kesalahan akan dikembalikan saat Anda menjalankan UDF. Untuk mengatasi masalah ini, tambahkan deklarasi pengkodean ke header kode. Format deklarasinya adalah #coding:utf-8 atau # -*- coding: utf-8 -*-. Kedua format tersebut setara. Untuk informasi lebih lanjut tentang spesifikasi Python 2 UDF, lihat Python 2 UDFs.
2. Unggah sumber daya dan daftarkan UDF
Setelah Anda menulis dan men-debug UDF, unggah kode UDF ke MaxCompute dan daftarkan UDF. Dalam contoh ini, UDF bernama UDF_EXTRACT_KEY_VALUE_WITH_SPLIT telah didaftarkan. Untuk informasi lebih lanjut tentang cara mengunggah dan mendaftarkan Java UDF, lihat Kemas Program Java, Unggah Paket, dan Buat MaxCompute UDF. Untuk informasi lebih lanjut tentang cara mengunggah dan mendaftarkan Python UDF, lihat Unggah Program Python dan Buat MaxCompute UDF.
3. Gunakan UDF
Setelah Anda mendaftarkan UDF, jalankan perintah berikut untuk mendapatkan nilai yang sesuai dengan kunci name dari string pasangan kunci-nilai. Nilai yang sesuai dengan kunci name mengandung pemisah.
set odps.sql.python.version=cp37; -- Jika Anda ingin menggunakan Python 3 UDF, jalankan perintah ini.
SELECT UDF_EXTRACT_KEY_VALUE_WITH_SPLIT('name:zhangsang:man;age:2;', ';', ':', 'name');Hasil berikut dikembalikan:
+--------------+
| _c0 |
+--------------+
| zhangsan:man |
+--------------+