Ketika string pasangan kunci-nilai berisi karakter pembatas di dalam kuncinya atau nilainya, fungsi bawaan KEYVALUE tidak dapat menguraikannya dengan benar. Gunakan fungsi user-defined function (UDF) UDF_EXTRACT_KEY_VALUE_WITH_SPLIT untuk mengekstraksi nilai dari string tersebut.
Topik ini memandu Anda menulis UDF dalam Java atau Python, mendaftarkannya di MaxCompute, dan memanggilnya dalam SQL.
Langkah-langkah:
Signature fungsi
string UDF_EXTRACT_KEY_VALUE_WITH_SPLIT(string <s>, string <split1>, string <split2>, string <keyname>)
Fungsi ini membagi s menjadi pasangan kunci-nilai menggunakan split1, lalu membagi setiap pasangan menjadi kunci dan nilai menggunakan split2, dan mengembalikan nilai untuk kunci yang ditentukan oleh keyname.
Parameter (semua bertipe STRING, semua wajib):
| Parameter | Deskripsi |
|---|---|
s |
String yang akan diurai |
split1 |
Pembatas yang memisahkan pasangan kunci-nilai |
split2 |
Pembatas yang memisahkan kunci dari nilai |
keyname |
Kunci yang nilainya akan dikembalikan |
Fungsi ini mengembalikan null jika salah satu parameter bernilai null atau jika kunci tidak ditemukan.
Prasyarat
Sebelum memulai, pastikan Anda memiliki:
-
Proyek MaxCompute dengan izin pengembangan UDF
-
Lingkungan pengembangan Java atau Python untuk menulis dan menguji kode UDF
1. Tulis UDF
Pilih bahasa untuk implementasi UDF Anda. Ketiga implementasi menghasilkan output yang sama.
Java
package com.aliyun.rewrite; // Nama paket, yang bersifat user-defined.
import com.aliyun.odps.udf.UDF;
public class ExtractKeyValueWithSplit extends UDF{
/**
* Gunakan split1 untuk membagi string dan mendapatkan pasangan kunci-nilai. Kemudian, gunakan split2 untuk membagi pasangan kunci-nilai dan mendapatkan kunci serta nilai.
* @param str String sumber.
* @param split1 Pembatas yang digunakan untuk membagi string dan mendapatkan pasangan kunci-nilai.
* @param split2 Pembatas yang digunakan untuk membagi pasangan kunci-nilai dan mendapatkan kunci serta nilai.
* @param keyname Nama kunci yang nilainya ingin Anda peroleh.
* @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 membagi string dan mendapatkan pasangan kunci-nilai.
for(String subStr: str.split(split1)){
// Gunakan split2 untuk membagi pasangan kunci-nilai dan mendapatkan kunci serta nilai. Lalu, ambil nilai yang sesuai dengan kunci tertentu.
if (subStr.startsWith(keySplit)){
return subStr.substring(keySplit.length());
}
}
} catch (Exception e) {
return null;
}
return null;
}
}
UDF Java harus memperluas kelas UDF. Metode evaluate menentukan signature fungsi yang digunakan dalam Pernyataan SQL: empat parameter input STRING dan nilai kembali STRING. Untuk spesifikasi kode lainnya, lihat Java UDFs.
Python 3
Proyek MaxCompute menjalankan Python 2 secara default. Untuk menggunakan UDF Python 3 ini, jalankan perintah berikut pada tingkat session sebelum memanggilnya: set odps.sql.python.version=cp37.
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 membagi string dan mendapatkan pasangan kunci-nilai.
for subStr in s.split(split1):
# Gunakan split2 untuk membagi pasangan kunci-nilai dan mendapatkan kunci serta nilai. Lalu, ambil nilai yang sesuai dengan kunci tertentu.
if subStr.startswith(key_split):
return subStr[len(key_split):]
Untuk spesifikasi UDF Python 3, lihat Python 3 UDFs.
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 membagi string dan mendapatkan pasangan kunci-nilai.
for subStr in s.split(split1):
# Gunakan split2 untuk membagi pasangan kunci-nilai dan mendapatkan kunci serta nilai. Lalu, ambil nilai yang sesuai dengan kunci tertentu.
if subStr.startswith(key_split):
return subStr[len(key_split):]
Jika kode UDF Python 2 Anda berisi karakter Tionghoa, tambahkan deklarasi encoding di bagian atas file: #coding:utf-8 atau # -*- coding: utf-8 -*-. Tanpa deklarasi ini, MaxCompute akan mengembalikan error saat menjalankan UDF.
Untuk spesifikasi UDF Python 2, lihat Python 2 UDFs.
2. Unggah sumber daya dan daftarkan UDF
Setelah menulis dan menguji UDF Anda, unggah kodenya ke MaxCompute dan daftarkan sebagai UDF_EXTRACT_KEY_VALUE_WITH_SPLIT.
-
UDF Java: Lihat Package program Java, unggah paket, dan buat UDF MaxCompute.
-
UDF Python: Lihat Unggah program Python dan buat UDF MaxCompute.
3. Gunakan UDF
Setelah mendaftarkan UDF, panggil dalam Pernyataan SQL. Contoh berikut mengekstraksi nilai untuk kunci name dari string di mana nilainya sendiri berisi pembatas :.
set odps.sql.python.version=cp37; -- Hanya diperlukan untuk UDF Python 3. Hilangkan baris ini untuk Java atau Python 2.
SELECT UDF_EXTRACT_KEY_VALUE_WITH_SPLIT('name:zhangsang:man;age:2;', ';', ':', 'name');
Dalam contoh ini:
-
split1adalah;, yang membagi string menjadi pasangan:name:zhangsang:mandanage:2 -
split2adalah:, yang mengidentifikasi kunci melalui pencocokan awalan -
Fungsi mengembalikan semua teks setelah
name:pada pasangan pertama yang cocok
Output yang diharapkan:
+--------------+
| _c0 |
+--------------+
| zhangsan:man |
+--------------+
Langkah selanjutnya
-
Untuk mengurai string pasangan kunci-nilai di mana kunci dan nilai tidak berisi pembatas, lihat Mendapatkan nilai string yang tidak memiliki pembatas.
-
Untuk mempelajari lebih lanjut tentang pengembangan UDF, lihat Java UDFs dan Python 3 UDFs.