Todos los productos
Search
Centro de documentos

Platform For AI:Uso de MaxCompute

Última actualización: Sep 22, 2026

Puede leer y escribir datos en MaxCompute desde los servicios de Platform for AI (PAI), como Deep Learning Containers (DLC) y Data Science Workshop (DSW). Para ello, utilice PyODPS, proporcionado por MaxCompute, o PAIIO, desarrollado por el equipo de PAI. Seleccione el método de lectura según su escenario de negocio.

Descripción general

  • PyODPS

    PyODPS es el SDK de MaxCompute para Python. Proporciona interfaces de Python sencillas y prácticas. Con PyODPS puede cargar y descargar archivos, crear tablas y ejecutar consultas ODPS SQL. Para obtener más información, consulte PyODPS overview.

  • paiio

    El equipo de PAI desarrolló el módulo PAIIO para facilitar la lectura y escritura de datos de tablas de MaxCompute en los servicios de PAI. PAIIO admite las siguientes interfaces:

    Interfaz

    Diferencia

    Descripción

    TableRecordDataset

    Depende del framework TensorFlow. Se recomienda usar la interfaz Dataset en TensorFlow 1.2 o versiones posteriores para reemplazar las interfaces originales de hilos y colas al crear flujos de datos. Para obtener más información, consulte Dataset.

    Lee datos de tablas de MaxCompute.

    TableReader

    Se basa en MaxCompute y no depende de TensorFlow. Accede directamente a las tablas de MaxCompute y obtiene resultados de E/S en tiempo real.

    Lee datos de tablas de MaxCompute.

    TableWriter

    Se basa en MaxCompute y no depende de TensorFlow. Escribe datos directamente en una tabla de MaxCompute y devuelve resultados.

    Escribe datos en tablas de MaxCompute.

Requisitos previos

Límites

El módulo PAIIO no admite imágenes de entorno de ejecución personalizadas. Solo puede usar PAIIO cuando seleccione una imagen de entorno de ejecución de TensorFlow 1.12, 1.15 o 2.0.

PyODPS

Con PyODPS puede leer y escribir datos de MaxCompute.

  1. Ejecute el siguiente comando para instalar PyODPS:

    pip install pyodps
  2. Ejecute el siguiente comando para comprobar si PyODPS está instalado: si no se devuelve ningún resultado ni se reporta algún error, significa que PyODPS ya está instalado.

    python -c "from odps import ODPS"
  3. Si la versión de Python que utiliza no es la versión predeterminada, ejecute el siguiente comando para cambiar a la versión predeterminada después de instalar pip:

    /home/tops/bin/python3.7 -m pip install setuptools>=3.0
    #/home/tops/bin/python3.7 is the directory in which Python is installed.
  4. Use PyODPS para leer y escribir datos de MaxCompute.

    import numpy as np
    import pandas as pd
    import os
    
    from odps import ODPS
    from odps.df import DataFrame
    # Establish a connection. 
    o = ODPS(
        os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
        os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
        project='your-default-project',
        endpoint='your-end-point',
    )
    
    # Create a non-partitioned table named my_new_table, which contains the fields with the specified names and of the specified data types. 
    
    table = o.create_table('my_new_table', 'num bigint, id string', if_not_exists=True)
    
    # Insert data into the non-partitioned table my_new_table. 
    records = [[111, 'aaa'],
              [222, 'bbb'],
              [333, 'ccc'],
              [444, 'Chinese']]
    o.write_table(table, records)
    
    # Read data from MaxCompute tables. 
    sql = '''
    SELECT  
        *
    FROM
        your-default-project.<table>
    LIMIT 100
    ;
    '''
    query_job = o.execute_sql(sql)
    result = query_job.open_reader(tunnel=True)
    df=result.to_pandas (n_process=1) # Configure n_process based on the specifications of the machine. If the value is greater than 1, multi-thread acceleration can be enabled.
    

    Nota:

    • ALIBABA_CLOUD_ACCESS_KEY_ID y ALIBABA_CLOUD_ACCESS_KEY_SECRET: establezca estas variables de entorno con el AccessKey ID y el AccessKey secret de su cuenta de Alibaba Cloud.

      Nota

      Se recomienda no usar directamente el AccessKey ID ni el AccessKey secret.

    • your-default-project y your-end-point: reemplace estos valores con el nombre del proyecto predeterminado y el endpoint correspondiente. Para obtener más información sobre los endpoints de cada región, consulte Endpoint.

    Para obtener más información sobre cómo usar PyODPS para realizar otras operaciones en tablas de MaxCompute, consulte Tables.

paiio

Preparación: configurar la información de la cuenta

Antes de usar PAIIO para leer o escribir datos en tablas de MaxCompute, configure la información de AccessKey necesaria para acceder a los recursos de MaxCompute. PAI permite obtener esta información desde un archivo de configuración. Para lograrlo, almacene el archivo de configuración en un sistema de archivos y haga referencia a la información en su código mediante variables de entorno.

  1. Cree un archivo de configuración con el siguiente contenido:

    access_id=xxxx
    access_key=xxxx
    end_point=http://xxxx

    Parámetro

    Descripción

    access_id

    El AccessKey ID de la cuenta de Alibaba Cloud.

    access_key

    El AccessKey secret de su cuenta de Alibaba Cloud.

    end_point

    El endpoint de MaxCompute. Por ejemplo, el endpoint de la región China (Shanghai) es http://service.cn-shanghai.maxcompute.aliyun.com/api. Para obtener más información, consulte Endpoint.

  2. Use la siguiente sintaxis para especificar la ruta del archivo de configuración en el código:

    os.environ['ODPS_CONFIG_FILE_PATH'] = '<your MaxCompute config file path>'

    Establezca el parámetro <your MaxCompute config file path> con la ruta del archivo.

TableRecordDataset

Descripción general

La versión de código abierto de TensorFlow recomienda usar TensorFlow Datasets en TensorFlow 1.2 o versiones posteriores. Esto permite reemplazar las interfaces originales de hilos y colas al crear flujos de datos. Varias interfaces de Dataset se combinan para generar los datos de cómputo, lo cual simplifica el código de entrada de datos.

  • Sintaxis (Python)

    class TableRecordDataset(Dataset):
      def __init__(self,
                   filenames,
                   record_defaults,
                   selected_cols=None,
                   excluded_cols=None,
                   slice_id=0,
                   slice_count=1,
                   num_threads=0,
                   capacity=0):
  • Parámetros

    Parámetro

    Obligatorio

    Tipo

    Valor predeterminado

    Descripción

    filenames

    Sí

    STRING

    Ninguna

    Los nombres de las tablas que desea leer. Las tablas deben usar el mismo esquema. Formato del nombre de la tabla: odps://${your_projectname}/tables/${table_name}/${pt_1}/${pt_2}/....

    record_defaults

    Sí

    LIST o TUPLE

    Ninguna

    El tipo de datos de la columna que desea leer. Si la columna está vacía, este parámetro indica el tipo de datos predeterminado. El sistema lanza una excepción si el tipo de datos no coincide con el de la columna leída o si no se convierte automáticamente.

    Valores válidos: FLOAT32, FLOAT64, INT32, INT64, BOOL y STRING. Para consultar los valores predeterminados del tipo de datos INT64, use la sintaxis np.array(0, np.int64).

    selected_cols

    No

    STRING

    Ninguna

    La columna que desea seleccionar. Separe varias columnas con comas (,). Si establece este parámetro en el valor predeterminado None, se leen todas las columnas. Solo puede especificar uno de los parámetros: selected_cols o excluded_cols.

    excluded_cols

    No

    STRING

    Ninguna

    La columna que desea excluir. Separe varias columnas con comas (,). Si establece este parámetro en el valor predeterminado None, se leen todas las columnas. Solo puede especificar uno de los parámetros: selected_cols o excluded_cols.

    slice_id

    No

    INT

    0

    El identificador del fragmento en el modo de lectura distribuida. Los identificadores comienzan en 0. En este modo, la tabla se divide en varios fragmentos según el valor del parámetro slice_count. El sistema lee los datos del fragmento indicado por slice_id.

    Si slice_id se deja en el valor predeterminado 0 y slice_count en 1, se lee toda la tabla. Si slice_id se mantiene en 0 y slice_count es mayor que 1, se lee el fragmento 0.

    slice_count

    No

    INT

    1

    El número de fragmentos en el modo de lectura distribuida. En la mayoría de los casos, este valor corresponde a la cantidad de workers. Si lo establece en el valor predeterminado 1, se lee la tabla completa sin fragmentarla.

    num_threads

    No

    INT

    0

    El número de hilos que habilita el lector integrado de cada tabla para prebuscar datos. Estos hilos son independientes de los hilos de cálculo. Valores válidos: de 1 a 64. Si num_threads se establece en 0, el sistema asigna automáticamente el 25 % de los hilos de cálculo a la prebúsqueda de datos.

    Nota

    Las operaciones de E/S afectan de manera distinta el rendimiento de cómputo general de cada modelo. Por lo tanto, aumentar la cantidad de hilos de prebúsqueda no necesariamente mejora la velocidad de entrenamiento del modelo completo.

    capacity

    No

    INT

    0

    El número de registros que se prebuscan. Si el valor de num_threads es mayor que 1, cada hilo prebusca capacity/num_threads registros de datos. Este valor se redondea hacia arriba. Si capacity se establece en 0, el lector integrado configura el tamaño total de datos que los hilos pueden prebuscar con base en el valor promedio de los primeros N registros de la tabla. El valor predeterminado de N es 256. Como resultado, cada hilo prebusca aproximadamente 64 MB de datos.

    Nota

    Si el tipo de datos de los campos en una tabla de MaxCompute es DOUBLE, TensorFlow lo asigna a np.float64.

  • Respuestas

    Se devuelve un objeto Dataset, el cual sirve como entrada para crear canalizaciones.

Ejemplos

Por ejemplo, suponga que almacena una tabla llamada test en su proyecto de MaxCompute denominado myproject. A continuación se muestra parte del contenido de la tabla.

itemid (BIGINT)

name (STRING)

price (DOUBLE)

virtual (BOOL)

25

"Apple"

5.0

False

38

"Pear"

4.5

False

17

"Watermelon"

2.2

False

El siguiente código de ejemplo muestra cómo usar la interfaz TableRecordDataset para leer las columnas itemid y price de la tabla test:

import os
import tensorflow as tf
import paiio

# Specify the path of the configuration file. Replace the value with the path where the configuration file is stored. 
os.environ['ODPS_CONFIG_FILE_PATH'] = "/mnt/data/odps_config.ini"
# Specify the tables that you want to read. Replace ${your_projectname} with the name of the MaxCompute project and ${table_name} with the name of the table that you want to access. 
table = ["odps://${your_projectname}/tables/${table_name}"]
# Specify the TableRecordDataset interface to read the itemid and price columns of the table. 
dataset = paiio.data.TableRecordDataset(table,
                                       record_defaults=[0, 0.0],
                                       selected_cols="itemid,price",
                                       num_threads=1,
                                       capacity=10)
# Specify epoch 2, batch size 3, and prefetch 100 batch. 
dataset = dataset.repeat(2).batch(3).prefetch(100)

ids, prices = tf.compat.v1.data.make_one_shot_iterator(dataset).get_next()

with tf.compat.v1.Session() as sess:
    sess.run(tf.compat.v1.global_variables_initializer())
    sess.run(tf.compat.v1.local_variables_initializer())
    try:
        while True:
            batch_ids, batch_prices = sess.run([ids, prices])
            print("batch_ids:", batch_ids)
            print("batch_prices:", batch_prices)
    except tf.errors.OutOfRangeError:
        print("End of dataset")

TableReader

Descripción general

Puede usar la interfaz TableReader en un SDK de MaxCompute sin depender de TensorFlow. Esto le permite acceder a las tablas de MaxCompute y obtener resultados de E/S en tiempo real.

  • Crear un objeto Reader y abrir una tabla

    • Sintaxis

    • reader = paiio.python_io.TableReader(table,
                           selected_cols="",
                          excluded_cols="",
                           slice_id=0,
                          slice_count=1):
    • Parámetros

    • Parámetro

      Obligatorio

      Tipo

      Valor predeterminado

      Descripción

      table

      Sí

      STRING

      Ninguna

      El nombre de la tabla de MaxCompute que desea abrir. Formato del nombre de la tabla: odps://${your_projectname}/tables/${table_name}/${pt_1}/${pt_2}/...

      selected_cols

      No

      STRING

      Cadena vacía ("")

      La columna que desea seleccionar. Separe varias columnas con comas (,). El valor debe ser de tipo STRING. Si este parámetro se deja con el valor predeterminado, se leen todas las columnas. Solo puede especificar uno de los parámetros: selected_cols o excluded_cols.

      excluded_cols

      No

      STRING

      Cadena vacía ("")

      La columna que desea excluir. Separe varias columnas con comas (,). El valor debe ser de tipo STRING. Si este parámetro se deja con el valor predeterminado, se leen todas las columnas. Solo puede especificar uno de los parámetros: selected_cols o excluded_cols.

      slice_id

      No

      INT

      0

      El identificador del fragmento en el modo de lectura distribuida. Valores válidos: [0, slice_count-1]. En este modo, la tabla se divide en varios fragmentos según el valor de slice_count. El sistema lee los datos del fragmento indicado por slice_id. Si establece este parámetro en el valor predeterminado 0, se leen todos los registros de la tabla.

      slice_count

      No

      INT

      1

      El número de fragmentos en el modo de lectura distribuida. En la mayoría de los casos, este valor corresponde a la cantidad de workers.

    • Respuestas

      Se devuelve un objeto Reader.

  • Leer registros de datos

    • Sintaxis

    • reader.read(num_records=1)
    • Parámetros

      num_records indica la cantidad de registros de datos que se leen de forma secuencial. El valor predeterminado es 1, lo que significa que se lee un solo registro. Si establece el parámetro num_records en un valor mayor que la cantidad de registros no leídos, se devuelven todos los registros leídos. Si no se devuelve ningún registro, se lanza PAIIO.python_io.OutOfRangeException.

    • Respuestas

      Se devuelve una matriz n-dimensional de numpy (o matriz de registros). Cada elemento de la matriz es una tupla formada por un registro de la tabla.

  • Obtener datos a partir de un registro específico

    • Sintaxis

    • reader.seek(offset=0)
    • Parámetros

    • offset indica el identificador del registro de datos a partir del cual desea obtener información. Los identificadores de registro comienzan en 0. Si especifica slice_id y slice_count, los datos se obtienen según la posición del registro indicado por offset dentro del fragmento correspondiente. Si offset supera el número total de registros de datos de la tabla, se lanza una excepción de rango excedido. Si la operación seek anterior devolvió un registro que no pertenece a la tabla y usted ejecuta otra operación seek, se lanza PAIIO.python_io.OutOfRangeException.

      Importante

      Si la cantidad de registros de datos no leídos en la tabla es menor que el tamaño de lote especificado para una operación de lectura, se devuelve dicha cantidad sin lanzar excepciones. Sin embargo, si ejecuta otra operación seek, sí se lanza una excepción.

    • Respuestas

      No se devuelve ningún valor. Si ocurre un error durante la operación, el sistema lanza una excepción.

  • Obtener el número total de registros de datos de la tabla

    • Sintaxis

    • reader.get_row_count()
    • Parámetros

      Ninguna

    • Respuestas

      Se devuelve la cantidad de registros de datos de la tabla. Si especifica slice_id y slice_count, se devuelve la cantidad de registros del fragmento.

  • Obtener el esquema de la tabla

    • Sintaxis

    • reader.get_schema()
    • Parámetros

      Ninguna

    • Respuestas

    • Se devuelve una matriz unidimensional. Cada elemento de la matriz corresponde al esquema de una columna de la tabla. A continuación se describen los parámetros que contiene un esquema.

      Parámetro

      Descripción

      colname

      El nombre de la columna.

      typestr

      El nombre del tipo de datos de MaxCompute.

      pytype

      El tipo de datos de Python que corresponde al valor especificado por typestr.

      A continuación se muestran las asignaciones entre los valores que se pueden especificar en typestr y pytype.

      typestr

      pytype

      BIGINT

      INT

      DOUBLE

      FLOAT

      BOOLEAN

      BOOL

      STRING

      OBJECT

      DATETIME

      INT

      MAP

      Nota

      Este tipo de datos no está disponible para la versión de TensorFlow integrada en PAI.

      OBJECT

  • Cerrar la tabla

    • Sintaxis

    • reader.close()
    • Parámetros

      Ninguna

    • Respuestas

      No se devuelve ningún valor. Si ocurre un error durante la operación, el sistema lanza una excepción.

Ejemplos

Por ejemplo, suponga que almacena una tabla llamada test en su proyecto de MaxCompute denominado myproject. A continuación se muestra parte del contenido de la tabla.

uid (BIGINT)

name (STRING)

price (DOUBLE)

virtual (BOOL)

25

"Apple"

5.0

False

38

"Pear"

4.5

False

17

"Watermelon"

2.2

False

El siguiente código muestra cómo usar la interfaz TableReader para leer los datos de las columnas uid, name y price.

    import os
    import paiio
    
    # Specify the path of the configuration file. Replace the value with the path where the configuration file is stored. 
    os.environ['ODPS_CONFIG_FILE_PATH'] = "/mnt/data/odps_config.ini"
    # Open a table and return a Reader object. Replace ${your_projectname} with the name of the MaxCompute project and ${table_name} with the name of the table that you want to access. 
    reader = paiio.python_io.TableReader("odps://myproject/tables/test", selected_cols="uid,name,price")
    
    # Obtain the total number of data records in the table. 
    total_records_num = reader.get_row_count() # return 3
    
    batch_size = 2
    # Read the table and return a record array in the [(uid, name, price)*2] format. 
    records = reader.read(batch_size) # Return [(25, "Apple", 5.0), (38, "Pear", 4.5)].
    records = reader.read(batch_size) # Return [(17, "Watermelon", 2.2)].
    # If you continue to read, an OutOfRange exception is thrown. 
    
    # Close the reader.
    reader.close()

TableWriter

TableWriter se implementa con base en el SDK de MaxCompute y no depende de TensorFlow. Con TableWriter puede escribir datos directamente en una tabla de MaxCompute.

Descripción general

  • Crear un objeto Writer y abrir una tabla

    • Sintaxis

      writer = paiio.python_io.TableWriter(table, slice_id=0)
      Nota
      • Esta interfaz escribe datos en una tabla sin eliminar la información existente.

      • Los datos recién escritos solo se pueden leer después de cerrar la tabla.

    • Parámetros

      Parámetro

      Obligatorio

      Tipo

      Valor predeterminado

      Descripción

      table

      Sí

      STRING

      Ninguna

      El nombre de la tabla de MaxCompute que desea abrir. Formato del nombre de la tabla:odps://${your_projectname}/tables/${table_name}/${pt_1}/${pt_2}/....

      slice_id

      No

      INT

      0

      El identificador del fragmento. En el modo distribuido, los datos se escriben en distintos fragmentos para evitar conflictos de escritura. En el modo independiente, use el valor predeterminado 0. En el modo distribuido, la operación de escritura falla si varios workers, incluidos los nodos de servidor de parámetros (PS), escriben datos en el mismo fragmento indicado por slice_id.

    • Respuestas

      Se devuelve un objeto Writer.

  • Escribir registros de datos

    • Sintaxis

      writer.write(values, indices)
    • Parámetros

      Parámetro

      Obligatorio

      Tipo

      Valor predeterminado

      Descripción

      values

      Sí

      STRING

      Ninguna

      El registro de datos que desea escribir. Puede escribir uno o varios registros.

      • Para escribir un solo registro, establezca values como una tupla, lista o matriz unidimensional compuesta por escalares. Si values es una lista o una matriz unidimensional, todas las columnas del registro tienen el mismo tipo de datos.

      • Para escribir uno o varios registros, establezca values como una lista o matriz unidimensional. Cada elemento del valor corresponde a un registro que es una tupla, lista o matriz unidimensional.

      indices

      Sí

      INT

      Ninguna

      Las columnas del registro de datos que desea escribir. El valor puede ser una tupla, lista o matriz unidimensional compuesta por índices enteros. Cada número del valor especificado por indices corresponde a una columna del registro. Por ejemplo, el número i corresponde a la columna i. La numeración de las columnas comienza en 0.

    • Respuestas

      No se devuelve ningún valor. Si ocurre un error durante la operación de escritura, el sistema lanza una excepción y finaliza el proceso actual.

  • Cerrar la tabla

    • Sintaxis

      writer.close()
      Nota

      En la instrucción WITH, no es necesario llamar explícitamente al método close() para cerrar una tabla.

    • Parámetros

      Ninguna

    • Respuestas

      No se devuelve ningún valor. Si ocurre un error durante la operación, el sistema lanza una excepción.

    • Resultados de ejemplo

      Uso de TableWriter en la instrucción WITH:

      with paiio.python_io.TableWriter(table) as writer:
        # Prepare values for writing.
          writer.write(values, incides)
          # Table would be closed automatically outside this section.

Ejemplos

import paiio
import os

# Specify the path of the configuration file. Replace the value with the path where the configuration file is stored. 
os.environ['ODPS_CONFIG_FILE_PATH'] = "/mnt/data/odps_config.ini"
# Prepare data. 
values = [(25, "Apple", 5.0, False),
          (38, "Pear", 4.5, False),
          (17, "Watermelon", 2.2, False)]

# Open a table and return a Writer object. Replace ${your_projectname} with the name of the MaxCompute project and ${table_name} with the name of the table that you want to access. 
writer = paiio.python_io.TableWriter("odps://project/tables/test")

# Write data to columns 0 to 3 of the table. 
records = writer.write(values, indices=[0, 1, 2, 3])

# Use the Writer object to close the table. 
writer.close()