Tous les produits
Search
Centre de documentation

MaxCompute:Manage tables

Dernière mise à jour :Aug 10, 2026

PyODPS fournit des méthodes pour créer, lire, écrire et gérer les tables et partitions MaxCompute. Cette rubrique présente les opérations courantes sur les tables, accompagnées d'exemples de code exécutables.

Lister toutes les tables

Appelez la méthode list_tables() sur l'objet d'entrée pour parcourir toutes les tables d'un projet.

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

Vérifier l'existence d'une table

Appelez la méthode exist_table() sur l'objet d'entrée pour vérifier si une table existe, et la méthode get_table() pour récupérer ses métadonnées.

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

L'objet table expose les propriétés suivantes :

Propriété

Description

t.schema

L'objet Schema contenant les définitions des colonnes

t.lifecycle

La valeur du cycle de vie (-1 signifie qu'aucun cycle de vie n'est défini)

t.creation_time

L'horodatage de création de la table

t.is_virtual_view

Indique si la table est une vue virtuelle

t.size

La taille de la table en octets

t.schema.columns

La liste de tous les objets colonne

Créer un schéma de table

Deux approches permettent de créer un schéma de table.

Définir explicitement les colonnes et les partitions

Importez les classes Schema, Column et Partition depuis le module odps.models, puis transmettez les listes de colonnes et de partitions au constructeur Schema. Cette approche prend en charge le paramètre comment pour chaque colonne et partition.

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)

Après avoir créé un schéma, inspectez son contenu à l'aide des propriétés suivantes :

  • Toutes les colonnes (y compris les clés de partition) : Sortie :

      print(schema.columns)
      [<column num, type bigint>,
       <column num2, type double>,
       <partition pt, type string>]
  • Uniquement les clés de partition : Sortie :

      print(schema.partitions)
      [<partition pt, type string>]
  • Noms des colonnes non partitionnées : Sortie :

      print(schema.names)
      ['num', 'num2']
  • Types de données des colonnes non partitionnées : Sortie :

      print(schema.types)
      [bigint, double]

Utiliser Schema.from_lists()

La méthode Schema.from_lists() constitue une syntaxe abrégée qui accepte des listes de noms et de types. Bien que plus simple, cette méthode ne permet pas de définir directement des commentaires pour les colonnes ou les partitions.

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

Sortie :

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

Créer une table

Appelez la méthode o.create_table() pour créer une table. Assurez-vous que tous les types de données des colonnes sont valides. Deux approches sont possibles : transmettre un objet Schema ou définir les colonnes sous forme de chaînes de caractères.

Créer une table à partir d'un schéma

Commencez par construire un objet Schema, puis transmettez-le à la méthode create_table().

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

Vérifiez que la table a bien été créée :

print(o.exist_table('my_new_table'))

Si la valeur True est renvoyée, la table a été créée avec succès.

Créer une table à partir de définitions de colonnes

Transmettez les noms et types de données des colonnes sous forme de chaîne ou de tuple à la méthode create_table().

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

Vérifiez que la table a bien été créée :

print(o.exist_table('my_new_table'))

Si la valeur True est renvoyée, la table a été créée avec succès.

Activer les types de données étendus MaxCompute V2.0

Par défaut, la méthode create_table() prend uniquement en charge les types de données BIGINT, DOUBLE, DECIMAL, STRING, DATETIME, BOOLEAN, MAP et ARRAY. Pour utiliser des types de données supplémentaires tels que TINYINT et STRUCT, définissez l'option options.sql.use_odps2_extension sur 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>')

Supprimer une table

Appelez la méthode delete_table() sur l'objet d'entrée, ou la méthode drop() sur l'objet table.

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.

Gérer les partitions de table

Vérifier si une table est partitionnée

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

Parcourir les partitions

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.
Important

Les expressions logiques utilisées dans iterate_partitions (telles que dt>20230119) nécessitent PyODPS version 0.11.3 ou ultérieure.

Vérifier l'existence d'une partition

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

Obtenir des informations sur une partition

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

Créer une partition

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.

Supprimer une partition

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.

Lire les données d'une table

Lire les N premiers enregistrements avec head()

La méthode head() permet de récupérer les 10 000 premiers enregistrements (ou moins) d'une table.

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

Lire avec open_reader() en utilisant une instruction with

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.

Lire avec open_reader() sans instruction with

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.

Lire directement dans un DataFrame pandas

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

Écrire des données dans une table

Écrire avec open_writer() en utilisant une instruction with

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)

Transmettez soit des listes simples, soit des objets Record (créés avec t.new_record()) à la méthode writer.write().

Créer automatiquement une partition lors de l'écriture

Définissez create_partition=True pour créer automatiquement la partition si elle n'existe pas.

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.

Écrire avec write_table()

La méthode write_table() de l'objet d'entrée MaxCompute offre une interface simplifiée pour l'écriture de données.

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)

Lire et écrire des données au format Apache Arrow

Apache Arrow est un format multi-langages destiné à l'échange de données entre différentes plateformes. MaxCompute prend en charge la lecture des données de table au format Arrow depuis 2021. Les versions de PyODPS 0.11.2 et ultérieures prennent en charge cette fonctionnalité.

Après avoir installé pyarrow dans votre environnement Python, ajoutez l'argument arrow=True lors de l'appel aux méthodes open_reader() ou open_writer() afin de lire ou d'écrire des objets 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"])
    # Write a RecordBatch.
    batch = pa.RecordBatch.from_pandas(df)
    writer.write(batch)
    # You can also use Pandas DataFrame directly.
    writer.write(df)