MaxCompute introduce la función de tabla de objetos, que permite al motor de cómputo del almacén de datos acceder a datos no estructurados y a sus metadatos en el almacenamiento de data lake. Este tema describe la sintaxis de los comandos y proporciona ejemplos de uso.
Contexto
En muchos flujos de trabajo de IA, los desarrolladores de almacenes de datos que conocen bien los datos y la lógica de negocio deben preprocesar o procesar datos no estructurados para modelos grandes. Estas tareas aprovechan la capacidad de cómputo a gran escala y bajo costo de las plataformas de big data. Con frecuencia, estos procesos y sus resultados interactúan con datos en el almacén de datos o en el data lake.
El uso de SQL para procesar datos no estructurados presenta varios desafíos:
Al leer desde object storage, los motores SQL de big data no pueden determinar el tamaño de los objetos, lo que complica la optimización del plan de ejecución y dificulta controlar la concurrencia o iniciar un número adecuado de tareas simultáneas. Sin un predicate pushdown eficaz, no se aprovecha por completo la capacidad de cómputo, especialmente en casos de sesgo de datos.
La lectura de metadatos desde object storage introduce una alta latencia porque cada consulta requiere una llamada remota al servicio de almacenamiento.
Las listas de archivos de object storage solo se pueden recuperar de forma secuencial dentro de un único proceso en una función de tabla definida por el usuario (UDTF), lo que resulta en un rendimiento deficiente en la lectura de datos.
Debe implementar la lógica de autorización y conectividad de red dentro de funciones definidas por el usuario (UDF) para conectarse a los servicios de almacenamiento.
Los almacenes de datos tradicionales no ofrecen funciones para cargar imágenes personalizadas de forma segura ni un entorno de ejecución seguro para UDF. Además, las llamadas remotas requieren una gestión compleja de la concurrencia con el servicio de cómputo distribuido.
Funciones
MaxCompute introduce la función de tabla de objetos, que permite al motor de cómputo del almacén de datos acceder a datos no estructurados y a sus metadatos en el almacenamiento de data lake. Esta función ofrece las siguientes capacidades:
Permite que el motor lea los metadatos de los archivos de OSS como una tabla.
Aprovecha una tabla de metadatos para almacenar en caché los metadatos versionados de los archivos de OSS. El motor SQL puede usar luego estos metadatos para optimizaciones de consulta, como filtrado de datos y predicate pushdown.
Proporciona funciones integradas para leer el contenido de archivos de datos no estructurados de diversas maneras.
Permite que el motor SQL de MaxCompute cree divisiones concurrentes basadas en los metadatos de la tabla de objetos, lo que habilita el cómputo distribuido a gran escala para mejorar la eficiencia en la lectura y el procesamiento de datos.
Permite cargar una imagen personalizada para crear UDF que procesen los datos no estructurados leídos por el motor.
Admite el procesamiento de datos no estructurados para generar resultados estructurados y escribirlos en tablas internas o externas del almacén de datos. Las versiones futuras también admitirán la generación de resultados no estructurados y su escritura nuevamente en OSS mediante tablas de objetos.
Es compatible con el motor Maxframe del ecosistema Python.
Limitaciones
El proyecto de MaxCompute debe tener los esquemas habilitados. Para obtener más información, consulte Enable schema.
MaxCompute debe ser compatible con Type System 2.0.
Actualmente, las tablas de objetos no admiten particiones.
Facturación
Una Object Table almacena un conjunto de metadatos correspondientes a archivos en OSS. Se cobran tarifas de almacenamiento por los metadatos que se actualizan y se guardan en la Object Table. Para obtener más información, consulte Storage pricing. Dado que los archivos de OSS no se almacenan dentro de MaxCompute, este servicio no cobra por su almacenamiento. OSS cobra por el almacenamiento y el acceso a los datos. Para obtener más información, consulte OSS storage pricing.
Para las tareas que extraen y actualizan metadatos de OSS, el valor
inputsizede cada archivo escaneado se basa en el tamaño de sus metadatos, no en el tamaño real del archivo. Por lo tanto, el costo total del trabajo de actualización depende de la cantidad de archivos, no de su tamaño total. Para obtener más información, consulte SQL billing for external tables.-
Se generan cargos de cómputo cuando utiliza una Object Table y sus metadatos para analizar y extraer datos no estructurados de OSS.
En un modelo pay-as-you-go, el análisis de metadatos de Object Table se factura de la misma manera que una tabla interna. Para obtener más información, consulte Standard SQL billing. El procesamiento del contenido de datos no estructurados de OSS se factura como una tabla externa. Para obtener más información, consulte SQL billing for external tables.
En un plan de facturación por suscripción, se utilizan recursos de suscripción prepaga. Para obtener más información, consulte Computing fees (subscription).
Crear una Object Table
Sintaxis
CREATE OBJECT TABLE [IF NOT EXISTS] <objecttable_name>
WITH SERDEPROPERTIES ('<key>' = '<value>')
LOCATION '<location>'
[TBLPROPERTIES ('<key>' = '<value>')]
[COMMENT '<comment>']
;
Las tablas de objetos deben usarse en un proyecto que tenga esquemas habilitados, y debe activar el modificador de sintaxis de esquema.
No es necesario definir columnas para una Object Table porque sus columnas de metadatos las proporciona el sistema.
Parámetros
Parámetro | Obligatorio | Descripción |
objecttable_name | Sí | El nombre de la tabla. |
SERDEPROPERTIES ('<key>'='<value>') | Sí | Especifica propiedades para el serializador-deserializador (SerDe). Puede especificar un rol de RAM para la autorización al establecer la clave Ejemplo: Antes de usar esta función, asegúrese de haber completado la autorización con un clic para
Nota La autorización con un clic solo es posible si el propietario del proyecto de MaxCompute y el propietario de la cuenta de OSS son la misma persona. |
location | Sí |
|
TBLPROPERTIES ('<key>'='<value>') | No |
|
comment | No | Un comentario para la tabla. |
Ejemplo
SET odps.namespace.schema=true;
CREATE OBJECT TABLE ot_demo_day
WITH serdeproperties (
'odps.properties.rolearn'='acs:ram::xxxxxx:role/aliyunodpsdefaultrole')
LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/odps-external-****/ottest/';
Consultar propiedades de Object Table
Sintaxis
DESC <object_table_name>
Parámetros
object_table_name: Obligatorio. El nombre de la tabla.
Ejemplo
SET odps.namespace.schema=true;
DESC ot_demo_day;
Se devuelve el siguiente resultado:
+------------------------------------------------------------------------------------+
| Owner: ALIYUN$****@test.aliyunid.com |
| Project: test_objecttable |
| Schema: default |
| TableComment: |
+------------------------------------------------------------------------------------+
| CreateTime: 2024-09-02 20:01:56 |
| LastDDLTime: 2024-09-02 20:01:56 |
| LastModifiedTime: 2024-09-02 20:01:56 |
+------------------------------------------------------------------------------------+
| InternalTable: YES | Size: 0 |
+------------------------------------------------------------------------------------+
| Native Columns: |
+------------------------------------------------------------------------------------+
| Field | Type | Label | Comment |
+------------------------------------------------------------------------------------+
| key | varchar(2048) | | The name of the object. |
| size | bigint | | The size of the returned object in bytes. |
| type | varchar(32) | | The type of the object and valid values: Normal, Multipart, Appendable, and Symlink. |
| last_modified | timestamp | | The last modified time of the object. |
| storage_class | varchar(32) | | The storage class of the object. |
| etag | varchar(64) | | The entity tag (ETag). When an object is created, an ETag is created to identify the content of the object. |
| restore_info | varchar(256) | | The restoration status of the object. |
| owner_id | bigint | | The ID of the bucket owner. |
| owner_display_name | varchar(256) | | The display name of the bucket owner. |
+------------------------------------------------------------------------------------+
La siguiente tabla describe las columnas clave del resultado.
Parámetro | Tipo | Permite nulos | Descripción |
key | VARCHAR(2048) La restricción de longitud en OSS es de 1,023 caracteres. Para obtener más información, consulte OSS object naming rules and examples. | False | La ruta relativa del objeto dentro de la Object Table. |
size | BIGINT | False | El tamaño del objeto en bytes. |
type | VARCHAR(32) | False | El tipo de objeto en OSS: Normal, Multipart, Appendable o Symlink. |
last_modified | TIMESTAMP_NTZ | False | La hora en que se modificaron por última vez los datos del objeto en OSS. |
storage_class | VARCHAR(32) | False | La clase de almacenamiento del objeto en OSS. Para ver una lista de clases de almacenamiento, consulte Storage classes. |
etag | VARCHAR(64) | False | El ETag es una etiqueta de entidad generada para un objeto. Identifica si el contenido de un objeto ha cambiado entre actualizaciones, pero no es un identificador único. |
restore_info | VARCHAR(256) | True | Indica si un objeto se ha restaurado desde el almacenamiento frío. Si un objeto se está restaurando, esta columna proporciona información relevante. |
owner_id | BIGINT | True | El ID del propietario del objeto. |
owner_display_name | VARCHAR(256) | True | El nombre para mostrar del propietario del objeto. |
Consultar sentencia CREATE TABLE
Sintaxis
SHOW CREATE TABLE <object_table_name>;
Parámetros
object_table_name: Obligatorio. El nombre de la tabla.
Ejemplo
SET odps.namespace.schema=true;
SHOW CREATE TABLE ot_demo_day;
Se devuelve el siguiente resultado:
CREATE OBJECT TABLE IF NOT EXISTS yunqi_object_****.`default`.ot_demo_day
WITH SERDEPROPERTIES (
'serialization.format'='1',
'odps.properties.rolearn'='acs:ram::139699392458****:role/aliyunodpsdefaultrole')
LOCATION
'oss://oss-cn-hangzhou-internal.aliyuncs.com/odps-external-****/ottest/'
TBLPROPERTIES (
'last_modified_time'='1731478307',
'transient_lastDdlTime'='1731478307',
'metadata.cache.mode'='manual',
'metadata.staleness.seconds'='3600');
Actualizar metadatos de Object Table
Los datos reales de una Object Table se almacenan en OSS. MaxCompute almacena en caché los metadatos de estos objetos y utiliza dicha caché para consultas y cálculos. Por lo tanto, debe actualizar la caché antes de usar una Object Table. Puede actualizar los metadatos manualmente o configurar actualizaciones periódicas al crear la tabla.
Tanto las actualizaciones manuales como las periódicas son actualizaciones completas.
Actualización manual
Cada actualización realiza una sincronización completa de los metadatos. Usted puede controlar el momento y la frecuencia de estas actualizaciones.
-
Sintaxis
ALTER TABLE <objecttable_name> REFRESH METADATA; -
Parámetros
objecttable_name: Obligatorio. El nombre de la tabla.
-
Ejemplo
SET odps.namespace.schema=true; ALTER TABLE ot_demo_day REFRESH METADATA;
Actualización periódica
Si los archivos en el directorio de OSS al que se asigna la Object Table cambian con frecuencia, puede configurar actualizaciones periódicas de metadatos. Esto reduce los costos de mantenimiento al especificar los parámetros relevantes cuando crea la tabla.
-
Sintaxis
SET odps.namespace.schema=true; SET odps.sql.type.system.odps2 = true; CREATE OBJECT TABLE ot_demo_day WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::xxxxxx:role/aliyunodpsdefaultrole' ) location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/odps-external-****/ottest/' tblproperties ( 'metadata.cache.mode' = 'periodic', 'metadata.staleness.seconds' = '3600' ); -
Parámetros
metadata.staleness.seconds: El intervalo de actualización. Este parámetro es obligatorio para el modoperiodic. El valor puede oscilar entre[1, 604800], lo que representa un rango de 1 segundo a 1 semana. Este parámetro representa una garantía de mejor esfuerzo, y el programador intentará ejecutar la actualización lo más cerca posible del intervalo especificado.-
metadata.cache.mode: El modo de actualización. Las opciones disponibles son:periodic: Activación periódica.crontab: Actualización programada.manual: Activación manual (predeterminado). Usted puede controlar el momento de la activación.
Actualización programada
Si los archivos en el directorio de OSS al que se asigna la Object Table cambian con frecuencia, puede programar actualizaciones de metadatos. Esto reduce los costos de mantenimiento al especificar los parámetros relevantes cuando crea la tabla.
-
Sintaxis
SET odps.namespace.schema=true; SET odps.sql.type.system.odps2 = true; CREATE OBJECT TABLE ot_demo_day WITH SERDEPROPERTIES ( 'odps.properties.rolearn'='acs:ram::xxxxxx:role/aliyunodpsdefaultrole' ) LOCATION 'oss://oss-cn-region-internal.aliyuncs.com/odps-external-****/ottest/' TBLPROPERTIES ( 'metadata.cache.mode' = 'crontab', 'metadata.crontab.expression' = 'your_timed_expression' ); -
Parámetros
metadata.crontab.expression: Una expresión cron que define la programación. Por ejemplo, para activar una actualización a las 2:00 PM todos los días, puede usar la expresión0 0 14 * * ?, que significa0segundos,0minutos, hora14(2:00 PM),everydía,everymes, y?para no especificar un día de la semana (mutuamente excluyente con el campo de día del mes para evitar conflictos).-
metadata.cache.mode: El modo de actualización. Las opciones disponibles son:crontab: Actualización programada.periodic: Activación periódica.manual: Activación manual (predeterminado). Usted puede controlar el momento de la activación.
Consultar tareas de actualización
Puede ejecutar el siguiente comando para consultar el historial de tareas de actualización.
SHOW refresh task history FOR object TABLE <object_table_name>;
-
Parámetros
<object_table_name> debe ser una tabla de objetos.
Valores devueltos: El ID de instancia de la tarea de actualización (InstanceId), la hora de creación (CreateTime), la hora de finalización (EndTime) y el estado (Status).
Si el Status es Failed, puede ejecutar
wait InstanceId;para consultar el registro y verificar los detalles del error.
-
Ejemplo
-- View the historical refresh tasks for the Object Table. SET odps.namespace.schema=true; SHOW refresh task history for object table ot_demo_day04; -- The following result is returned. ID = 20260105*******f +---------------------------------------------------------------------------------------------------+ | Project: test_project | | Schema: default | | Task: *** | +---------------------------------------------------------------------------------------------------+ | History: | +---------------------------------------------------------------------------------------------------+ | InstanceId | CreateTime | EndTime | Status | +---------------------------------------------------------------------------------------------------+ | 20260105******************ks | 2026-01-05 14:12:00 | 2026-01-05 14:12:04 | Terminated | | 20260105******************y3 | 2026-01-05 14:10:00 | 2026-01-05 14:10:03 | Terminated | +---------------------------------------------------------------------------------------------------+ OK
Consulta de Object Tables
Después de que una Object Table obtiene los metadatos de archivos de un directorio de OSS, puede consultar la tabla para explorar dichos metadatos. También puede usar sentencias SQL para realizar cálculos sobre los metadatos, como filtrado, coincidencia, agregaciones, uniones, funciones de ventana, ORDER BY y LIMIT.
Sintaxis
SELECT * FROM <object_table_name>;
Parámetros
object_table_name: Obligatorio. El nombre de la tabla.
Ejemplo
-- You can query the data uploaded to the specified OSS directory. If the amount of data is large, you can limit the result to five rows.
SET odps.namespace.schema=true;
SELECT * FROM ot_demo_day [limit 5];
Eliminar una Object Table
Una Object Table almacena en caché metadatos de usuario, lo que consume almacenamiento y genera costos. Si ya no necesita los datos en caché, puede eliminar la Object Table. Puede volver a crearla más adelante si es necesario.
Sintaxis
DROP TABLE [IF EXISTS] <object_table_name>;
Parámetros
object_table_name: Obligatorio. El nombre de la tabla.
Ejemplo
SET odps.namespace.schema=true;
DROP TABLE IF EXISTS ot_demo_day;
Preguntas frecuentes
ODPS-0010000:System internal error
-
Síntoma
Se reporta el siguiente mensaje de error:
ODPS-0010000:System internal error - ActionHandler job failed with failinfo storage service worker error occured: common/io/oss/oss_file_system_cppsdk.cpp(919): OSSRequestException: Status: -50, RequestId: , ErrorCode: ClientError:-50, Message: E_HTTP_ERROR_CONN_REFUSED -
Causa
Utilizó un endpoint público para OSS al crear la Object Table.
-
Solución
Cuando crea una Object Table, el parámetro
locationdebe contener un endpoint interno para eloss_endpoint. Para obtener información sobre cómo conseguir el endpoint interno, consulte Parameter description. Si el error persiste después de cambiar la dirección a un endpoint interno, póngase en contacto con el equipo de soporte técnico de MaxCompute mediante la apertura de un ticket de soporte.
Error en la actualización periódica
Síntoma
Configuró parámetros de actualización periódica al crear la Object Table. Sin embargo, la actualización no se ejecuta cuando se alcanza el intervalo.
Solución
Asegúrese de que el parámetro location utilizado para crear la Object Table especifique un endpoint interno de OSS. Para obtener más información sobre la creación de una Object Table, consulte Parameters.