Tüm Ürünler
Search
Belge Merkezi

MaxCompute:Manage tables

Son Güncelleme:Oct 04, 2026

PyODPS, MaxCompute tablolarını ve bölümlerini oluşturma, okuma, yazma ve yönetme yöntemleri sunar. Bu sayfada, çalıştırılabilir kod örnekleriyle birlikte yaygın tablo işlemleri ele alınmaktadır.

Tüm tabloları listeleyin

Bir projedeki tüm tablolar üzerinde yineleme yapmak için giriş nesnesinde list_tables() yöntemini çağırın.

for table in odps.list_tables():
    # Query all tables in a project.

Bir tablonun var olup olmadığını kontrol edin

Bir tablonun var olup olmadığını kontrol etmek için giriş nesnesinde exist_table() yöntemini, tablo meta verilerini almak için ise get_table() yöntemini çağırın.

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>]

Tablo nesnesi aşağıdaki özellikleri sunar:


Özellik


Açıklama


t.schema


Sütun tanımlarını içeren Schema nesnesi


t.lifecycle


Yaşam döngüsü değeri (-1 yaşam döngüsü ayarlanmadığını gösterir)


t.creation_time


Tablo oluşturma zaman damgası


t.is_virtual_view


Tablonun sanal bir görünüm olup olmadığı


t.size


Tablo boyutu (bayt cinsinden)


t.schema.columns


Tüm sütun nesnelerinin listesi

Tablo şeması oluşturun

Tablo şeması oluşturmak için iki yaklaşım mevcuttur.

Sütunları ve bölümleri açıkça tanımlayın

odps.models modülünden Schema, Column ve Partition sınıflarını içe aktarın, ardından sütun ve bölüm listelerini Schema yapıcısına iletin. Bu yaklaşım, her sütun ve bölümde comment parametresinin kullanılmasını destekler.

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)

Şema oluşturduktan sonra içeriğini aşağıdaki özelliklerle inceleyebilirsiniz:

  • Tüm sütunlar (bölüm anahtarı sütunları dahil): Çıktı:

      print(schema.columns)
      [<column num, type bigint>,
       <column num2, type double>,
       <partition pt, type string>]
  • Yalnızca bölüm anahtarı sütunları: Çıktı:

      print(schema.partitions)
      [<partition pt, type string>]
  • Bölüm olmayan sütun adları: Çıktı:

      print(schema.names)
      ['num', 'num2']
  • Bölüm olmayan sütun veri türleri: Çıktı:

      print(schema.types)
      [bigint, double]

Schema.from_lists() kullanın

Schema.from_lists() yöntemi, ad ve tür listelerini kabul eden kısayol bir yöntemdir. Bu yöntem daha basittir ancak doğrudan sütun veya bölüm açıklamalarını desteklemez.

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

Çıktı:

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

Tablo oluşturun

Tablo oluşturmak için o.create_table() yöntemini çağırın. Tüm sütun veri türlerinin geçerli olduğundan emin olun. İki yaklaşım mevcuttur: Bir Schema nesnesi iletmek veya sütun tanımlarını dizge olarak iletmek.

Şemadan tablo oluşturun

Önce bir Schema nesnesi oluşturun, ardından bunu create_table() yöntemine iletin.

# Create a table schema.
from odps.models import Schema
schema = Schema.from_lists(['num', 'num2'], ['bigint', 'double'], ['pt'], ['string'])

# Create a table by using the schema that you created.
table = o.create_table('my_new_table', schema)

# Create a table only if no table with the same name exists.
table = o.create_table('my_new_table', schema, if_not_exists=True)

# Configure the lifecycle of the table.
table = o.create_table('my_new_table', schema, lifecycle=7)

Tablonun oluşturulduğunu doğrulayın:

print(o.exist_table('my_new_table'))

True değeri döndürülürse tablo başarıyla oluşturulmuştur.

Sütun tanımlarından tablo oluşturun

Sütun adlarını ve veri türlerini bir dizge veya demet olarak create_table() yöntemine iletin.

# Create a partitioned table named my_new_table with specified common columns and partition key columns.
table = o.create_table('my_new_table', ('num bigint, num2 double', 'pt string'), if_not_exists=True)

# Create a non-partitioned table named my_new_table02.
table = o.create_table('my_new_table02', 'num bigint, num2 double', if_not_exists=True)

Tablonun oluşturulduğunu doğrulayın:

print(o.exist_table('my_new_table'))

True değeri döndürülürse tablo başarıyla oluşturulmuştur.

MaxCompute V2.0 genişletilmiş veri türlerini etkinleştirin

Varsayılan olarak create_table() yöntemi yalnızca BIGINT, DOUBLE, DECIMAL, STRING, DATETIME, BOOLEAN, MAP ve ARRAY veri türlerini destekler. TINYINT ve STRUCT gibi ek veri türlerini kullanmak için options.sql.use_odps2_extension seçeneğini True olarak ayarlayın.

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>')

Tabloyu silin

Giriş nesnesinde delete_table() yöntemini veya tablo nesnesinde drop() yöntemini çağırın.

o.delete_table('my_table_name', if_exists=True)  # Delete a table only if the table exists.
t.drop() # Call the drop() method to drop a table if the table exists.

Tablo bölümlerini yönetin

Tablonun bölümlenmiş olup olmadığını kontrol edin

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

Bölümler üzerinde yineleme yapın

table = o.get_table('my_new_table')
for partition in table.partitions:  # Iterate over all partitions.
    print(partition.name)  # An iteration step. In this step, the partition name is displayed.
for partition in table.iterate_partitions(spec='pt=test'):  # Iterate over level-2 partitions in the partition named test.
    print(partition.name)  # An iteration step. In this step, the partition name is displayed.
for partition in table.iterate_partitions(spec='dt>20230119'):  # Iterate over level-2 partitions in the partitions that meet the dt>20230119 condition.
    print(partition.name)  # An iteration step. In this step, the partition name is displayed.
Önemli

iterate_partitions içindeki mantıksal ifadeler (dt>20230119 gibi) PyODPS 0.11.3 veya sonraki sürümleri gerektirir.

Bir bölümün var olup olmadığını kontrol edin

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

Bölüm bilgilerini alın

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

Bölüm oluşturun

t = o.get_table('my_new_table')
t.create_partition('pt=test', if_not_exists=True)  # Create a partition only if no partition with the same name exists.

Bölümü silin

t = o.get_table('my_new_table')
t.delete_partition('pt=test', if_exists=True)  # Set the if_exists parameter to True. This ensures that a partition is deleted only if the partition exists.
partition.drop()  # Call the drop() method to drop a partition if the partition exists.

Tablodan veri okuyun

head() ile ilk N kaydı okuyun

head() yöntemi, bir tablodan ilk 10.000 veya daha az kaydı getirir.

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

with deyimi kullanarak open_reader() ile okuma yapın

with t.open_reader(partition='pt=test') as reader:
count = reader.count
for record in reader[5:10]  # You can execute the statement multiple times until all records are read. The number of records is specified by count. You can change the code to parallel-operation code.
    # Process one record.

with deyimi olmadan open_reader() ile okuma yapın

reader = t.open_reader(partition='pt=test')
count = reader.count
for record in reader[5:10]  # You can execute the statement multiple times until all records are read. The number of records is specified by count. You can change the code to parallel-operation code.
    # Process one record.

Doğrudan pandas DataFrame'e okuyun

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

Tabloya veri yazın

with deyimi kullanarak open_writer() ile yazma yapın

with t.open_writer(partition='pt=test') as writer:
	  records = [[111, 'aaa', True],                 # A list can be used.
	             [222, 'bbb', False],
	             [333, 'ccc', True],
	             [444, 'Chinese', False]]
    writer.write(records)  # Records can be iterable objects.

records = [t.new_record([111, 'aaa', True]),   # Record objects can be used.
           t.new_record([222, 'bbb', False]),
           t.new_record([333, 'ccc', True]),
           t.new_record([444, 'Chinese', False])]
writer.write(records)

writer.write() yöntemine düz listeler veya (t.new_record() ile oluşturulan) Record nesneleri iletin.

Yazma sırasında bölümü otomatik olarak oluşturun

Bölüm yoksa otomatik olarak oluşturmak için create_partition=True parametresini ayarlayın.

with t.open_writer(partition='pt=test', create_partition=True) as writer:
    records = [[111, 'aaa', True],                 # A list can be used.
               [222, 'bbb', False],
               [333, 'ccc', True],
               [444, 'Chinese', False]]
    writer.write(records)  # Records can be iterable objects.

write_table() ile yazma yapın

MaxCompute giriş nesnesindeki write_table() yöntemi, veri yazmak için daha basit bir arabirim sunar.

records = [[111, 'aaa', True],                 # A list can be used.
           [222, 'bbb', False],
           [333, 'ccc', True],
           [444, 'Chinese', False]]
o.write_table('test_table', records, partition='pt=test', create_partition=True)

Apache Arrow biçiminde veri okuma ve yazma

Apache Arrow, farklı platformlar arasında veri alışverişi için kullanılan diller arası bir biçimdir. MaxCompute, 2021 yılından bu yana Arrow biçiminde tablo verisi okumayı desteklemektedir. PyODPS 0.11.2 ve sonraki sürümler bu özelliği destekler.

Python ortamınıza pyarrow yükledikten sonra, RecordBatch nesnelerini okumak veya yazmak için open_reader() veya open_writer() çağrılırken arrow=True parametresini ekleyin.

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"])
    # Write a RecordBatch.
    batch = pa.RecordBatch.from_pandas(df)
    writer.write(batch)
    # You can also use Pandas DataFrame directly.
    writer.write(df)