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 |
|
|
L'objet |
|
|
La valeur du cycle de vie ( |
|
|
L'horodatage de création de la table |
|
|
Indique si la table est une vue virtuelle |
|
|
La taille de la table en octets |
|
|
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.
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)