PyODPS adalah SDK Python untuk MaxCompute yang menyediakan operasi dasar pada objek MaxCompute dan kerangka kerja DataFrame, memungkinkan Anda menggunakan Python untuk pemrosesan dan analisis big data di DataWorks atau lingkungan lokal. Topik ini menjelaskan cara menginstal PyODPS, menghubungkan ke MaxCompute, menjalankan kueri SQL, serta menggunakan API DataFrame di lingkungan lokal.
Prasyarat
Sebelum memulai, pastikan Anda memenuhi persyaratan berikut:
Python versi 3.6 atau yang lebih baru telah diinstal.
Anda memiliki Akun Alibaba Cloud dan kredensial akses untuk terhubung ke Proyek MaxCompute Anda. Kami menyarankan menggunakan AccessKey dari Pengguna RAM.
Instal PyODPS
Instal PyODPS
Linux/macOS:
pip3 install pyodpsWindows:
pip install pyodps
Jika Anda mengalami error kompilasi kode C saat menginstal dependensi seperti numpy atau pyarrow, versi pip atau setuptools Anda mungkin sudah usang. Perbarui keduanya, lalu coba instal ulang:
# Linux/macOS pip3 install -U pip setuptools # Windows pip install -U pip setuptoolsVerifikasi instalasi
Linux/macOS:
python3 -c "from odps import ODPS"Windows:
python -c "from odps import ODPS"Jika tidak ada error yang muncul, instalasi berhasil. Jika terjadi error, lihat bagian Pemecahan Masalah.
Atur variabel lingkungan
Untuk menghindari hard-coding kredensial di dalam kode Anda, atur kredensial tersebut sebagai variabel lingkungan.
Masuk ke Konsol RAM, salin ID AccessKey dan Secret Access Key Anda, lalu konfigurasikan sesuai sistem operasi Anda. Contohnya, pada macOS (zsh):
macOS (zsh):
vim ~/.zshrcTambahkan baris berikut dan ganti placeholder dengan nilai aktual Anda
export ALIBABA_CLOUD_ACCESS_KEY_ID=<your-AccessKey-ID> export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<your-AccessKey-secret>Terapkan konfigurasi
source ~/.zshrcVerifikasi bahwa variabel lingkungan telah diatur
echo $ALIBABA_CLOUD_ACCESS_KEY_ID echo $ALIBABA_CLOUD_ACCESS_KEY_SECRETSetiap perintah harus menghasilkan nilai yang sesuai. Jika output-nya kosong, ulangi langkah 2 dan 3.
Untuk detail tentang pengaturan variabel lingkungan di Linux, macOS, dan Windows, lihat Atur AccessKey Alibaba Cloud dalam variabel lingkungan.
Inisialisasi titik masuk ODPS
Kelas ODPS merupakan titik masuk untuk semua operasi PyODPS. Kelas ini harus diinisialisasi dengan informasi kredensial dan proyek sebelum Anda memanggil API lainnya.
Sebelum menjalankan kode, pastikan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID dan ALIBABA_CLOUD_ACCESS_KEY_SECRET telah diatur. Anda juga dapat menentukan AccessKey secara eksplisit, tetapi hal ini tidak disarankan karena hard-coding kredensial dalam kode sumber menimbulkan risiko keamanan.
Untuk mendapatkan ID AccessKey dan Secret Access Key, lihat Dapatkan ID AccessKey dan Secret Access Key.
Definisi manual
Kode berikut menunjukkan cara mendefinisikan titik masuk ODPS secara manual:
Disarankan (menggunakan variabel lingkungan)
import os from odps import ODPS o = ODPS( access_id=os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'), secret_access_key=os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'), project='your-default-project', endpoint='your-end-point', )Tidak disarankan (ditentukan secara eksplisit hanya untuk pengujian)
import os from odps import ODPS o = ODPS( access_id='your-aliyun-access-key-id', secret_access_key='your-aliyun-access-key-secret', project='your-default-project', endpoint='your-end-point', )
Gunakan kredensial keamanan STS
Jika Anda menggunakan kredensial keamanan STS untuk mengakses ODPS, inisialisasi objek titik masuk ODPS sebagai berikut:
import os
from odps import ODPS
from odps.accounts import StsAccount
# Pastikan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID diatur ke ID AccessKey Anda,
# variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_SECRET diatur ke Secret Access Key Anda,
# dan variabel lingkungan ALIBABA_CLOUD_STS_TOKEN diatur ke token STS Anda.
# Untuk alasan keamanan, hindari hard-coding ID AccessKey atau Secret Access Key Anda.
account = StsAccount(
os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
os.getenv('ALIBABA_CLOUD_STS_TOKEN'),
)
o = ODPS(
account=account,
project='**your-default-project**',
endpoint='**your-end-point**',
)Parameter | Deskripsi |
your-default-project | Nama Proyek MaxCompute Anda. Masuk ke Konsol MaxCompute untuk melihat daftar proyek Anda. |
your-end-point | Titik akhir untuk wilayah dan lingkungan jaringan Anda. Untuk daftar titik akhir, lihat Endpoints. Contohnya, titik akhir jaringan publik untuk wilayah China (Hangzhou) adalah |
Setelah menyelesaikan konfigurasi ini, Anda dapat menggunakan PyODPS di lingkungan lokal Anda. Untuk informasi lebih lanjut, lihat Ikhtisar operasi dasar.
Pemrosesan data
SQL
MaxCompute mendukung dua mode eksekusi SQL: mode tradisional dan mode MaxCompute Query Acceleration (MaxQA). Kedua mode mendukung pernyataan DDL dan DML. MaxQA menyimpan cache hasil pekerjaan dan mengembalikan hasil cache tersebut untuk mempercepat kueri berulang. Untuk informasi aturan penagihan, lihat Biaya komputasi (Pay-As-You-Go).
Metode execute_sql() dan run_sql() hanya mendukung pernyataan DDL dan DML. Untuk jenis pernyataan lainnya, gunakan metode khususnya. Contohnya, gunakan metode create_table() untuk pernyataan CREATE TABLE, dan gunakan metode run_xflow() atau execute_xflow() untuk perintah API.
Mode tradisional
Gunakan execute_sql() untuk menjalankan pernyataan SQL dan open_reader() untuk membaca hasilnya:
# Gunakan metode khusus untuk membuat tabel
o.create_table('my_t', 'num bigint, id string', if_not_exists=True)
# Jalankan kueri SELECT
result = o.execute_sql('SELECT * FROM pyodps_iris LIMIT 3')
with result.open_reader() as reader:
for record in reader:
print(record)Mode MaxQA
MaxCompute Query Acceleration (MaxQA) adalah fitur MaxCompute yang mempercepat kueri pada data berukuran kecil hingga menengah dengan menggunakan kolam sumber daya khusus. Mulai dari PyODPS v0.11.4.1, Anda dapat menggunakan execute_sql_interactive untuk menjalankan kueri SQL melalui MaxQA.
o.execute_sql_interactive('SELECT * FROM dual', fallback='all')Jika MaxQA tidak dapat menjalankan pernyataan SQL tersebut, sistem secara otomatis beralih ke mode tradisional. Untuk menonaktifkan fallback ini, atur parameter fallback ke False. Anda juga dapat menentukan kebijakan fallback sebagai string yang dipisahkan koma:
Kebijakan Fallback | Deskripsi |
generic | Beralih ke mode tradisional ketika terjadi error yang tidak dikenal. |
noresource | Beralih ke mode tradisional ketika sumber daya tidak mencukupi. |
upgrading | Beralih ke mode tradisional selama pembaruan sistem. |
timeout | Beralih ke mode tradisional ketika terjadi timeout. |
unsupported | Beralih ke mode tradisional untuk skenario yang tidak didukung. |
Kebijakan default-nya adalah unsupported,upgrading,noresource,timeout. Untuk memastikan fallback selalu diaktifkan, atur nilainya ke all, yang merupakan alias untuk generic,unsupported,upgrading,noresource,timeout.
# Hanya fallback ketika sumber daya tidak mencukupi atau skenarionya tidak didukung
o.execute_sql_interactive('SELECT * FROM dual', fallback="noresource,unsupported")Untuk detail lebih lanjut tentang operasi SQL di PyODPS, lihat SQL.
DataFrame
PyODPS menyediakan API DataFrame untuk pemrosesan data.
Berbeda dengan pandas, DataFrame PyODPS dievaluasi secara lazy. Artinya, komputasi hanya dilakukan ketika Anda memanggil metode eksekusi langsung, seperti execute() atau persist().
from odps.df import DataFrame
# Muat tabel pyodps_iris ke dalam DataFrame
iris = DataFrame(o.get_table('pyodps_iris'))
# Filter baris dan cetak hasilnya. Metode .execute() memicu komputasi aktual.
for record in iris[iris.sepalwidth < 3].execute():
print(record)
Secara default, PyODPS yang dijalankan secara lokal tidak mencetak log detail seperti Logview. Untuk mengaktifkan output verbose:
from odps import options
options.verbose = TrueParameter waktu proses (petunjuk)
Anda dapat mengatur parameter waktu proses untuk satu kueri dengan meneruskan dictionary hints ke pemanggilan SQL:
o.execute_sql('SELECT * FROM pyodps_iris', hints={'odps.sql.mapper.split.size': 16})Untuk menerapkan petunjuk ke semua pemanggilan SQL dalam satu sesi, Anda dapat mengonfigurasinya secara global:
from odps import options
# Semua pemanggilan execute_sql() berikutnya akan secara otomatis menyertakan petunjuk ini
options.sql.settings = {'odps.sql.mapper.split.size': 16}
o.execute_sql('SELECT * FROM pyodps_iris')Contoh lengkap
Contoh berikut menunjukkan proses lengkap: menghubungkan ke MaxCompute, membuat tabel, menulis data, membaca data, mengkueri tabel my_new_table, dan membersihkan sumber daya.
Contoh ini memanggil table.drop() di bagian akhir, yang secara permanen menghapus tabel my_new_table. Untuk menghindari kehilangan data, jangan gunakan nama tabel yang sudah ada, karena skrip ini akan menghapus tabel tersebut. Jika Anda ingin menyimpan tabel yang dibuat oleh skrip ini, hapus pemanggilan table.drop() di bagian akhir.
Buat file lokal bernama
test-pyodps-local.py.Tambahkan kode berikut:
import os from odps import ODPS o = ODPS( access_id=os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'), secret_access_key=os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'), project='your-default-project', endpoint='your-end-point', ) table = o.create_table('my_new_table', 'num bigint, id string', if_not_exists=True) records = [[111, 'aaa'], [222, 'bbb'], [333, 'ccc'], [444, 'non_ascii_text']] o.write_table(table, records) # Baca catatan for record in o.read_table(table): print(record[0], record[1]) # Gunakan SQL untuk mengkueri tabel my_new_table result = o.execute_sql('SELECT * FROM my_new_table;') print('Baca data dari my_new_table menggunakan open_reader:') # Cetak hasil kueri with result.open_reader() as reader: for record in reader: print(record[0], record[1]) # Hapus tabel untuk melepaskan sumber daya table.drop()Jalankan skrip
python test-pyodps-local.pyOutput yang diharapkan:
111 aaa 222 bbb 333 ccc 444 non_ascii_text Baca data dari my_new_table menggunakan open_reader: 111 aaa 222 bbb 333 ccc 444 non_ascii_text
Pemecahan Masalah
Error instalasi dependensi
Gejala: Terjadi error kompilasi kode C saat menginstal dependensi seperti numpy atau pyarrow.
Penyebab: Versi pip atau setuptools Anda sudah usang.
Solusi: Perbarui pip dan setuptools, lalu instal ulang PyODPS.
# Linux/macOS pip3 install -U pip setuptools # Windows pip install -U pip setuptools
Konflik versi pip dengan beberapa versi Python
Gejala: PyODPS diinstal untuk versi Python yang salah.
Penyebab: Sistem Anda memiliki beberapa versi Python, dan
pip3mengarah ke versi yang berbeda dari yang Anda inginkan.Solusi: Panggil pip melalui executable Python spesifik yang ingin Anda gunakan.
/home/tops/bin/python3.7 -m pip install pyodpsGanti
/home/tops/bin/python3.7dengan path ke instalasi Python target Anda.
Error versi OpenSSL urllib3
Gejala: Instalasi gagal dengan pesan error
urllib3 v2.0 only supports OpenSSL 1.1.1+.Penyebab: Instalasi Python Anda menggunakan versi OpenSSL lama yang tidak kompatibel dengan urllib3 v2.0.
Solusi: Instal versi urllib3 yang lebih lama sebelum menginstal PyODPS.
# Linux/macOS pip3 install "urllib3<2.0" # Windows pip install "urllib3<2.0"