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 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.
-
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
Tener instalado Python 3.6 o una versión posterior. Se recomienda no usar Python 2.7 ni versiones anteriores.
Las variables de entorno deben estar configuradas. Para obtener más información, consulte Configure environment variables on Linux, macOS, and Windows.
MaxCompute debe estar activado y se debe haber creado un proyecto. Para obtener más información, consulte Activate MaxCompute y Create a MaxCompute project.
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.
-
Ejecute el siguiente comando para instalar PyODPS:
pip install pyodps -
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" -
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. -
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.
NotaSe 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.
-
Cree un archivo de configuración con el siguiente contenido:
access_id=xxxx access_key=xxxx end_point=http://xxxxPará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. -
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.
NotaLas 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.
NotaSi 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
Parámetros
-
Respuestas
Se devuelve un objeto Reader.
reader = paiio.python_io.TableReader(table, selected_cols="", excluded_cols="", slice_id=0, slice_count=1):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.
-
Leer registros de datos
Sintaxis
-
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.
reader.read(num_records=1) -
Obtener datos a partir de un registro específico
Sintaxis
Parámetros
-
Respuestas
No se devuelve ningún valor. Si ocurre un error durante la operación, el sistema lanza una excepción.
reader.seek(offset=0)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.ImportanteSi 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.
-
Obtener el número total de registros de datos de la tabla
Sintaxis
-
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.
reader.get_row_count() -
Obtener el esquema de la tabla
Sintaxis
-
Parámetros
Ninguna
Respuestas
reader.get_schema()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
NotaEste tipo de datos no está disponible para la versión de TensorFlow integrada en PAI.
OBJECT
-
Cerrar la tabla
Sintaxis
-
Parámetros
Ninguna
-
Respuestas
No se devuelve ningún valor. Si ocurre un error durante la operación, el sistema lanza una excepción.
reader.close()
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)NotaEsta 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()NotaEn 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()