All Products
Search
Document Center

MaxCompute:Mengelola tabel

Last Updated:Mar 01, 2026

PyODPS menyediakan metode untuk membuat, membaca, menulis, dan mengelola tabel serta partisi MaxCompute. Halaman ini mencakup operasi tabel umum beserta contoh kode yang dapat dijalankan.

Daftar semua tabel

Panggil list_tables() pada objek entry untuk melakukan iterasi atas semua tabel dalam suatu Proyek.

for table in odps.list_tables():
    # Kueri semua tabel dalam suatu proyek.

Periksa apakah tabel ada

Panggil exist_table() pada objek entry untuk memeriksa keberadaan tabel, dan get_table() untuk mengambil metadata tabel.

t = odps.get_table('table_name')
t.schema
odps.Schema {
  c_int_a                 bigint
  c_int_b                 bigint
  c_double_a              double
  c_double_b              double
  c_string_a              string
  c_string_b              string
  c_bool_a                boolean
  c_bool_b                boolean
  c_datetime_a            datetime
  c_datetime_b            datetime
}
t.lifecycle
-1
print(t.creation_time)
2014-05-15 14:58:43
t.is_virtual_view
False
t.size
1408
t.schema.columns
[<column c_int_a, type bigint>,
 <column c_int_b, type bigint>,
 <column c_double_a, type double>,
 <column c_double_b, type double>,
 <column c_string_a, type string>,
 <column c_string_b, type string>,
 <column c_bool_a, type boolean>,
 <column c_bool_b, type boolean>,
 <column c_datetime_a, type datetime>,
 <column c_datetime_b, type datetime>]

Objek tabel mengekspos properti-properti berikut:

Properti

Deskripsi

t.schema

Objek Schema dengan definisi kolom

t.lifecycle

Nilai lifecycle (-1 berarti tidak ada lifecycle yang ditetapkan)

t.creation_time

Timestamp pembuatan tabel

t.is_virtual_view

Apakah tabel tersebut merupakan virtual view

t.size

Ukuran tabel dalam byte

t.schema.columns

Daftar semua objek kolom

Buat skema tabel

Terdapat dua pendekatan untuk membuat skema tabel.

Definisikan kolom dan partisi secara eksplisit

Impor Schema, Column, dan Partition dari odps.models, lalu berikan daftar kolom dan partisi ke konstruktor Schema. Pendekatan ini mendukung parameter comment pada setiap kolom dan partisi.

from odps.models import Schema, Column, Partition
columns = [
    Column(name='num', type='bigint', comment='the column'),
    Column(name='num2', type='double', comment='the column2'),
]
partitions = [Partition(name='pt', type='string', comment='the partition')]
schema = Schema(columns=columns, partitions=partitions)

Setelah membuat skema, periksa isinya dengan properti-properti berikut:

  • Semua kolom (termasuk kolom kunci partisi): Output:

      print(schema.columns)
      [<column num, type bigint>,
       <column num2, type double>,
       <partition pt, type string>]
  • Hanya kolom kunci partisi: Output:

      print(schema.partitions)
      [<partition pt, type string>]
  • Nama kolom non-partisi: Output:

      print(schema.names)
      ['num', 'num2']
  • Tipe data kolom non-partisi: Output:

      print(schema.types)
      [bigint, double]

Gunakan Schema.from_lists()

Schema.from_lists() adalah cara singkat yang menerima daftar nama dan tipe. Metode ini lebih sederhana tetapi tidak mendukung komentar kolom atau partisi secara langsung.

from odps.models import Schema
schema = Schema.from_lists(['num', 'num2'], ['bigint', 'double'], ['pt'], ['string'])
print(schema.columns)

Output:

[<column num, type bigint>,
 <column num2, type double>,
 <partition pt, type string>]

Buat tabel

Panggil o.create_table() untuk membuat tabel. Pastikan semua tipe data kolom valid. Terdapat dua pendekatan: berikan objek Schema atau definisi kolom dalam bentuk string.

Buat tabel dari skema

Buat objek Schema terlebih dahulu, lalu berikan ke create_table().

# Buat skema tabel.
from odps.models import Schema
schema = Schema.from_lists(['num', 'num2'], ['bigint', 'double'], ['pt'], ['string'])

# Buat tabel menggunakan skema yang telah Anda buat.
table = o.create_table('my_new_table', schema)

# Buat tabel hanya jika belum ada tabel dengan nama yang sama.
table = o.create_table('my_new_table', schema, if_not_exists=True)

# Konfigurasikan lifecycle tabel.
table = o.create_table('my_new_table', schema, lifecycle=7)

Verifikasi bahwa tabel berhasil dibuat:

print(o.exist_table('my_new_table'))

Jika True dikembalikan, berarti tabel berhasil dibuat.

Buat tabel dari definisi kolom

Berikan nama kolom dan tipe data sebagai string atau tuple ke create_table().

# Buat tabel partisi bernama my_new_table dengan kolom umum dan kolom kunci partisi yang ditentukan.
table = o.create_table('my_new_table', ('num bigint, num2 double', 'pt string'), if_not_exists=True)

# Buat tabel non-partisi bernama my_new_table02.
table = o.create_table('my_new_table02', 'num bigint, num2 double', if_not_exists=True)

Verifikasi bahwa tabel berhasil dibuat:

print(o.exist_table('my_new_table'))

Jika True dikembalikan, berarti tabel berhasil dibuat.

Aktifkan tipe data ekstensi MaxCompute V2.0

Secara default, create_table() hanya mendukung tipe data BIGINT, DOUBLE, DECIMAL, STRING, DATETIME, BOOLEAN, MAP, dan ARRAY. Untuk menggunakan tipe data tambahan seperti TINYINT dan STRUCT, atur options.sql.use_odps2_extension menjadi True.

from odps import options
options.sql.use_odps2_extension = True
table = o.create_table('my_new_table', 'cat smallint, content struct<title:varchar(100), body:string>')

Hapus tabel

Panggil delete_table() pada objek entry atau panggil drop() pada objek tabel.

o.delete_table('my_table_name', if_exists=True)  # Hapus tabel hanya jika tabel tersebut ada.
t.drop() # Panggil metode drop() untuk menghapus tabel jika tabel tersebut ada.

Kelola partisi tabel

Periksa apakah tabel dipartisi

table = o.get_table('my_new_table')
if table.schema.partitions:
    print('Table %s is partitioned.' % table.name)

Lakukan iterasi atas partisi

table = o.get_table('my_new_table')
for partition in table.partitions:  # Lakukan iterasi atas semua partisi.
    print(partition.name)  # Langkah iterasi. Pada langkah ini, nama partisi ditampilkan.
for partition in table.iterate_partitions(spec='pt=test'):  # Lakukan iterasi atas partisi tingkat-2 dalam partisi bernama test.
    print(partition.name)  # Langkah iterasi. Pada langkah ini, nama partisi ditampilkan.
for partition in table.iterate_partitions(spec='dt>20230119'):  # Lakukan iterasi atas partisi tingkat-2 dalam partisi yang memenuhi kondisi dt>20230119.
    print(partition.name)  # Langkah iterasi. Pada langkah ini, nama partisi ditampilkan.
Penting

Ekspresi logika dalam iterate_partitions (seperti dt>20230119) memerlukan PyODPS 0.11.3 atau versi yang lebih baru.

Periksa apakah partisi ada

table = o.get_table('my_new_table')
table.exist_partition('pt=test,sub=2015')

Dapatkan informasi partisi

table = o.get_table('my_new_table')
partition = table.get_partition('pt=test')
print(partition.creation_time)
partition.size

Buat partisi

t = o.get_table('my_new_table')
t.create_partition('pt=test', if_not_exists=True)  # Buat partisi hanya jika belum ada partisi dengan nama yang sama.

Hapus partisi

t = o.get_table('my_new_table')
t.delete_partition('pt=test', if_exists=True)  # Atur parameter if_exists ke True. Ini memastikan bahwa partisi hanya dihapus jika partisi tersebut ada.
partition.drop()  # Panggil metode drop() untuk menghapus partisi jika partisi tersebut ada.

Baca data dari tabel

Baca N catatan pertama dengan head()

Metode head() mengambil hingga 10.000 catatan pertama dari sebuah tabel.

from odps import ODPS
t = o.get_table('dual')
for record in t.head(3):
    # Proses setiap catatan.

Baca dengan open_reader() menggunakan pernyataan with

with t.open_reader(partition='pt=test') as reader:
count = reader.count
for record in reader[5:10]  # Anda dapat menjalankan pernyataan ini beberapa kali hingga semua catatan terbaca. Jumlah catatan ditentukan oleh count. Anda dapat mengubah kode menjadi kode operasi paralel.
    # Proses satu catatan.

Baca dengan open_reader() tanpa pernyataan with

reader = t.open_reader(partition='pt=test')
count = reader.count
for record in reader[5:10]  # Anda dapat menjalankan pernyataan ini beberapa kali hingga semua catatan terbaca. Jumlah catatan ditentukan oleh count. Anda dapat mengubah kode menjadi kode operasi paralel.
    # Proses satu catatan.

Baca langsung ke dalam pandas DataFrame

with t.open_reader(partition='pt=test') as reader:
pd_df = reader.to_pandas()

Tulis data ke tabel

Tulis dengan open_writer() menggunakan pernyataan with

with t.open_writer(partition='pt=test') as writer:
	  records = [[111, 'aaa', True],                 # Daftar dapat digunakan.
	             [222, 'bbb', False],
	             [333, 'ccc', True],
	             [444, 'Chinese', False]]
    writer.write(records)  # Catatan dapat berupa objek iterable.

records = [t.new_record([111, 'aaa', True]),   # Objek Record dapat digunakan.
           t.new_record([222, 'bbb', False]),
           t.new_record([333, 'ccc', True]),
           t.new_record([444, 'Chinese', False])]
writer.write(records)

Berikan baik daftar biasa maupun objek Record (dibuat dengan t.new_record()) ke writer.write().

Buat partisi otomatis saat menulis

Atur create_partition=True untuk secara otomatis membuat partisi jika partisi tersebut belum ada.

with t.open_writer(partition='pt=test', create_partition=True) as writer:
    records = [[111, 'aaa', True],                 # Daftar dapat digunakan.
               [222, 'bbb', False],
               [333, 'ccc', True],
               [444, 'Chinese', False]]
    writer.write(records)  # Catatan dapat berupa objek iterable.

Tulis dengan write_table()

Metode write_table() pada objek entry MaxCompute menyediakan antarmuka yang lebih sederhana untuk menulis data.

records = [[111, 'aaa', True],                 # Daftar dapat digunakan.
           [222, 'bbb', False],
           [333, 'ccc', True],
           [444, 'Chinese', False]]
o.write_table('test_table', records, partition='pt=test', create_partition=True)

Baca dan tulis data dalam format Apache Arrow

Apache Arrow adalah format lintas bahasa untuk pertukaran data antar platform berbeda. MaxCompute telah mendukung pembacaan data tabel dalam format Arrow sejak 2021. Fitur ini didukung oleh PyODPS versi 0.11.2 dan yang lebih baru.

Setelah menginstal pyarrow di lingkungan Python Anda, tambahkan arrow=True saat memanggil open_reader() atau open_writer() untuk membaca atau menulis objek RecordBatch Arrow.

import pandas as pd
import pyarrow as pa
with t.open_writer(partition='pt=test', create_partition=True, arrow=True) as writer:
    records = [[111, 'aaa', True],
               [222, 'bbb', False],
               [333, 'ccc', True],
               [444, 'Chinese', False]]
    df = pd.DataFrame(records, columns=["int_val", "str_val", "bool_val"])
    # Tulis RecordBatch.
    batch = pa.RecordBatch.from_pandas(df)
    writer.write(batch)
    # Anda juga dapat menggunakan Pandas DataFrame secara langsung.
    writer.write(df)