MaxCompute menyediakan fungsi yang ditentukan pengguna (UDF) dan kemampuan pengembangan Python seperti PyODPS dan MaxFrame. Dokumen ini menjelaskan cara menggunakan gambar dalam pekerjaan pengembangan MaxCompute UDF, PyODPS, dan MaxFrame.
Menggunakan gambar dalam pengembangan SQL UDF
Contoh berikut menunjukkan penggunaan Pandas dalam UDF untuk menjumlahkan kolom.
Tulis skrip Python UDF dan simpan sebagai
sum_pandas.py. Berikut adalah contoh skrip:from odps.udf import annotate import pandas as pd @annotate("string, string -> string") class SumColumns(object): def evaluate(self, arg1, arg2): # Konversi parameter input ke pandas DataFrame df = pd.DataFrame({'col1': arg1.split(','), 'col2': arg2.split(',')}) # Lakukan operasi pemrosesan data dengan menggunakan pandas # Hitung jumlah dua kolom sebagai contoh df['sum'] = df['col1'].astype(int) + df['col2'].astype(int) # Konversi hasil pemrosesan menjadi string dan kembalikan result = ','.join(df['sum'].astype(str).values) return resultUnggah skrip
sum_pandas.pysebagai sumber daya ke Proyek MaxCompute Anda. Untuk detail lebih lanjut, lihat Tambahkan Sumber Daya. Gunakan perintah berikut:ADD PY sum_pandas.py -f;Daftarkan skrip
sum_pandas.pysebagai UDF SumColumns. Untuk detail lebih lanjut, lihat Buat UDF. Gunakan perintah berikut:CREATE FUNCTION SumColumns AS 'sum_pandas.SumColumns' USING 'sum_pandas.py';Buat tabel uji
testsumdengan data uji yang sesuai.CREATE TABLE testsum (col1 string, col2 string); INSERT INTO testsum VALUES ('1,2,3','1,2,3'),('1,2,3','3,2,1'),('1,2,3','4,5,6');Tentukan gambar melalui parameter Flag saat memanggil UDF.
set odps.sql.python.version=cp37; set odps.session.image = ; SELECT SumColumns(col1,col2) AS result FROM testsum;Hasil yang diharapkan:
+------------+ | result | +------------+ | 2,4,6 | | 4,4,4 | | 5,7,9 | +------------+
Menggunakan gambar dalam pengembangan PyODPS
Contoh berikut mengimplementasikan fungsi psi dari paket scipy.
Siapkan tabel uji
test_float_coldan masukkan data uji.CREATE TABLE test_float_col (col1 double); INSERT INTO test_float_col VALUES (3.75),(2.51);Tulis kode PyODPS untuk menghitung psi(col1) dan simpan sebagai
psi_col.py. Berikut adalah contoh kode:import os from odps import ODPS, options def my_psi(v): from scipy.special import psi return float(psi(v)) # Jika proyek mengaktifkan isolasi, opsi berikut tidak diperlukan options.sql.settings = {"odps.isolation.session.enable": True} o = ODPS( # Pastikan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID disetel ke ID AccessKey Anda, # dan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_SECRET disetel ke Rahasia AccessKey Anda. # Tidak disarankan untuk langsung menggunakan string ID AccessKey dan Rahasia AccessKey. os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'), os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'), project='your-default-project', endpoint='your-end-point' ) df = o.get_table("test_float_col").to_df() # Eksekusi langsung dan dapatkan hasilnya df.col1.map(my_psi).execute(image='scipy') # Simpan ke tabel lain df.col1.map(my_psi).persist("result_table", image='scipy')Deskripsi parameter:
ALIBABA_CLOUD_ACCESS_KEY_ID: Setel variabel lingkungan ini ke ID AccessKey yang memiliki izin MaxCompute yang diperlukan untuk proyek MaxCompute. Anda bisa mendapatkan ID AccessKey dari halaman Pengelolaan AccessKey.
ALIBABA_CLOUD_ACCESS_KEY_SECRET: Setel variabel lingkungan ini ke Rahasia AccessKey yang sesuai dengan ID AccessKey.
your-default-project: Nama proyek MaxCompute. Untuk melihat nama proyek, masuk ke Konsol MaxCompute, pilih Workspace > Projects di panel navigasi sebelah kiri.
your-end-point: Titik akhir untuk wilayah tempat proyek MaxCompute berada. Anda dapat memilih titik akhir berdasarkan metode konektivitas jaringan. Sebagai contoh,
http://service.cn-chengdu.maxcompute.aliyun.com/api. Untuk detailnya, lihat Titik Akhir.
Lihat hasilnya di tabel
result_table.SELECT * FROM result_tableHasil yang diharapkan:
+----------------------+ | col1 | +----------------------+ | 1.1825373886117962 | | 0.7080484451910534 | +----------------------+
Menggunakan gambar dalam pengembangan MaxFrame
Contoh berikut mengimplementasikan fungsi psi dari paket scipy.
Buat tabel uji
test_float_coldan masukkan data uji.CREATE TABLE test_float_col (col1 double); INSERT INTO test_float_col VALUES (3.75),(2.51);Tulis kode MaxFrame untuk menghitung psi(col1) dan simpan sebagai
psi_col.py. Berikut adalah contoh kode:import os from odps import ODPS, options from maxframe.session import new_session import maxframe.dataframe as md from maxframe.config import options from maxframe import config # Gunakan gambar scipy bawaan config.options.sql.settings = { "odps.session.image": "scipy" } def my_psi(v): from scipy.special import psi return float(psi(v)) o = ODPS( # Pastikan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID disetel ke ID AccessKey Anda, # dan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_SECRET disetel ke Rahasia AccessKey Anda. # Tidak disarankan untuk langsung menggunakan string ID AccessKey dan Rahasia AccessKey. os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'), os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'), project='your-default-project', endpoint='your-end-point' ) # Buat sesi MaxFrame session = new_session(o) df = md.read_odps_table('test_float_col') # Eksekusi dan dapatkan hasilnya print(df.col1.map(my_psi).execute().fetch()Deskripsi parameter:
ALIBABA_CLOUD_ACCESS_KEY_ID: Setel variabel lingkungan ini ke ID AccessKey yang memiliki izin MaxCompute yang diperlukan untuk proyek MaxCompute. Anda bisa mendapatkan ID AccessKey dari halaman Pengelolaan AccessKey.
ALIBABA_CLOUD_ACCESS_KEY_SECRET: Setel variabel lingkungan ini ke Rahasia AccessKey yang sesuai dengan ID AccessKey.
your-default-project: Nama proyek MaxCompute. Untuk melihat nama proyek, masuk ke Konsol MaxCompute, pilih Workspace > Projects di panel navigasi sebelah kiri.
your-end-point: Titik akhir untuk wilayah tempat proyek MaxCompute berada. Anda dapat memilih titik akhir berdasarkan metode konektivitas jaringan. Sebagai contoh,
http://service.cn-chengdu.maxcompute.aliyun.com/api. Untuk detailnya, lihat Titik Akhir.
Hasil yang diharapkan:
0 1.182537 1 0.708048 Name: col1, dtype: float64