Todos los productos
Search
Centro de documentos

MaxCompute:Tablas externas de Tablestore

Última actualización: Sep 24, 2026

Este tema describe cómo importar datos de Tablestore (Open Table Service, anteriormente OTS) a MaxCompute para conectar varias fuentes de datos de forma transparente.

Contexto

Tablestore es un servicio de almacenamiento de datos NoSQL basado en el sistema distribuido Apsara de Alibaba Cloud. Este servicio proporciona almacenamiento y acceso en tiempo real a grandes volúmenes de datos estructurados. Para obtener más información, consulte Documentación de Tablestore.

Puede usar DataWorks junto con MaxCompute para crear, buscar, consultar, configurar, procesar y analizar tablas externas de manera visual. Para obtener más información, consulte External tables.

Notas de uso

  • Asegúrese de que exista conectividad de red entre MaxCompute y Tablestore. Cuando acceda a los datos de Tablestore desde MaxCompute en la nube pública, se recomienda utilizar el endpoint privado de Tablestore. El endpoint privado termina en ots-internal.aliyuncs.com, por ejemplo, tablestore://odps-ots-dev.cn-shanghai.ots-internal.aliyuncs.com.

  • Tablestore y MaxCompute utilizan sistemas de tipos de datos distintos. En la siguiente tabla se muestran las correspondencias entre los tipos de datos compatibles con Tablestore y MaxCompute.

    Tipo de MaxCompute

    Tipo de Tablestore

    STRING

    STRING

    BIGINT

    INTEGER

    DOUBLE

    DOUBLE

    BOOLEAN

    BOOLEAN

    BINARY

    BINARY

  • Las tablas externas de Tablestore no admiten el atributo de agrupamiento (clustering).

Requisitos previos

Descripción de permisos

  • Al acceder a tablas externas de Tablestore, los datos se leen mediante el rol especificado en el parámetro odps.properties.rolearn. Esto aplica sin importar si utiliza una cuenta de Alibaba Cloud, un usuario de RAM o un rol de RAM. Por lo tanto, debe crear un rol de RAM, otorgarle permisos para acceder a Tablestore y configurar el ARN del rol en el parámetro odps.properties.rolearn.

  • El rol se puede crear mediante autorización con un solo clic o mediante autorización personalizada. Para obtener más información, consulte Authorization for external data sources. Si necesita detalles sobre el parámetro odps.properties.rolearn, consulte Parameter description.

Crear una tabla externa

MaxCompute ofrece la función de tablas externas. Con ellas puede importar datos de Tablestore al sistema de metadatos de MaxCompute para su procesamiento. En esta sección se explica cómo crear una tabla externa de Tablestore.

A continuación se muestra un ejemplo de la instrucción CREATE EXTERNAL TABLE.

DROP TABLE IF EXISTS ots_table_external;
CREATE EXTERNAL TABLE IF NOT EXISTS ots_table_external
(
  odps_orderkey bigint,
  odps_orderdate string,
  odps_custkey bigint,
  odps_orderstatus string,
  odps_totalprice double,
  odps_createdate timestamp
)
STORED BY 'com.aliyun.odps.TableStoreStorageHandler'
WITH SERDEPROPERTIES (
  'tablestore.columns.mapping'=':o_orderkey,:o_orderdate,o_custkey,o_orderstatus,o_totalprice',
  'tablestore.table.name'='ots_tpch_orders',
  'odps.properties.rolearn'='acs:ram::xxxxx:role/<role_name>',
  'tablestore.read.mode'='permissive',
  'tablestore.corrupt.column'='ColumnName',
  'tablestore.timestamp.ticks.unit'='seconds',
  'tablestore.column.odps_createdate.timestamp.ticks.unit'='millis',
  'tablestore.table.put.row'='true'
)
LOCATION 'tablestore://odps-ots-dev.cn-shanghai.ots-internal.aliyuncs.com';

En la siguiente tabla se describen los parámetros principales utilizados en la instrucción de creación anterior.

Parámetro

Obligatorio

Descripción

com.aliyun.odps.TableStoreStorageHandler

Sí

Controlador de almacenamiento integrado de MaxCompute que se usa para procesar datos de Tablestore. Define la interacción entre MaxCompute y Tablestore. La lógica correspondiente está implementada por MaxCompute.

tablestore.columns.mapping

Sí

Columnas de la tabla de Tablestore a las que desea que acceda MaxCompute. Incluye columnas de clave principal y columnas de atributos.

  • Un signo de dos puntos (:) al inicio del nombre de una columna indica que se trata de una columna de clave principal de la tabla de Tablestore, por ejemplo, :o_orderkey y :o_orderdate en este ejemplo. Las demás son columnas de atributos.

  • Tablestore admite de 1 a 4 columnas de clave principal. Los tipos de datos de estas columnas pueden ser STRING, INTEGER y BINARY. La primera columna de clave principal es la clave de partición.

  • Al definir las correspondencias de columnas, debe especificar todas las columnas de clave principal de la tabla de Tablestore indicada, así como las columnas de atributos a las que accederá desde MaxCompute.

tablestore.table.name

Sí

Nombre de la tabla de Tablestore a la que desea que acceda MaxCompute. En este ejemplo, el nombre es ots_tpch_orders.

odps.properties.rolearn

Sí

Especifique el ARN del rol de RAM que tiene permiso para acceder a OSS. Puede obtenerlo en la página de detalles del rol dentro de la consola de RAM.

  1. Inicie sesión en la consola de RAM.

  2. En la barra de navegación izquierda, seleccione Identities > Roles.

  3. En la página Roles, haga clic en el Role Name deseado para ir a la página de detalles del rol.

  4. En la sección Basic Information, obtenga el valor de ARN.

    Ejemplo: acs:ram::xxxxx:role/aliyunodpsdefaultrole

tablestore.timestamp.ticks.unit

No

Configuración de tipo de hora a nivel de tabla. Este parámetro indica que todos los campos del tipo de datos INTEGER de la tabla externa usan la misma unidad de tiempo. Valores válidos:

  • Seconds

  • millis

  • micros (microsegundos)

  • nanos

tablestore.column.<col1_name>.timestamp.ticks.unit

No

Configuración de tipo de hora a nivel de columna. Este parámetro define la unidad de tiempo de una columna específica en la tabla externa. Valores válidos:

  • seconds

  • millis (en milisegundos)

  • micros

  • nanos

Nota

Si configura tanto tablestore.timestamp.ticks.unit como tablestore.column.<col1_name>.timestamp.ticks.unit, el parámetro tablestore.column.<col1_name>.timestamp.ticks.unit tiene prioridad.

tablestore.table.put.row

No

Define el modo de escritura de la operación PutRow. Valores válidos:

  • True: habilitado.

  • False (predeterminado): deshabilitado.

Nota

Para definir el modo de escritura de la operación PutRow, configure el siguiente parámetro de indicador. El valor predeterminado es False. Para obtener más información, consulte Flag parameter list.

SET odps.sql.unstructured.tablestore.put.row=true;

tablestore.read.mode

No

Indica el comportamiento de lectura cuando MaxCompute detecta datos dañados en la tabla externa de Tablestore. Valores válidos:

  • permissive (predeterminado): si MaxCompute detecta datos dañados, los omite.

  • failfast: si MaxCompute detecta datos dañados, reporta un error.

Para ver ejemplos de procesamiento de datos dañados, consulte examples of dirty data processing.

tablestore.corrupt.column

No

Especifica la columna donde se escriben los datos dañados.

  • Este parámetro es obligatorio únicamente cuando tablestore.read.mode se establece en permissive.

  • La columna indicada debe ser la última de la tabla externa de MaxCompute.

  • No se permite especificar una columna de clave principal de Tablestore.

Para ver ejemplos de procesamiento de datos dañados, consulte examples of dirty data processing.

LOCATION

Sí

Define la información de Tablestore, como el nombre y el endpoint de una instancia. Debe completar la autorización de RAM o de Security Token Service (STS) para garantizar un acceso seguro a los datos de Tablestore.

Nota

Si al usar el endpoint público recibe un error que indica tipos de red incompatibles, cambie el tipo de red a classic network.

Ejecute la siguiente instrucción para consultar la estructura de la tabla externa que creó:

DESC extended <table_name>;
Nota

En el resultado de la ejecución, Extended Info incluye la información básica de la tabla externa, los datos del controlador de almacenamiento y la ubicación de dicha tabla.

Consultar datos en la tabla externa

Una vez creada la tabla externa, ejecute una instrucción SQL de MaxCompute para acceder a los datos de Tablestore mediante dicha tabla. Ejemplo:

SELECT odps_orderkey, odps_orderdate, SUM(odps_totalprice) AS sum_total
FROM ots_table_external
WHERE odps_orderkey > 5000 AND odps_orderkey < 7000 AND odps_orderdate >= '1996-05-03' AND odps_orderdate < '1997-05-01'
GROUP BY odps_orderkey, odps_orderdate
HAVING sum_total> 400000.0;
Nota

Al consultar tablas o campos externos, los nombres no distinguen entre mayúsculas y minúsculas. Tampoco se admiten conversiones forzadas de mayúsculas o minúsculas.

Cuando accede a datos de Tablestore mediante instrucciones SQL de MaxCompute, todas las operaciones —como la selección de nombres de columna— se ejecutan en MaxCompute. En el ejemplo anterior, los nombres de las columnas son odps_orderkey y odps_totalprice, en lugar de la columna de clave principal o_orderkey y la columna de atributo o_totalprice de la tabla de Tablestore. Esto ocurre porque las correspondencias se definen en la instrucción DDL utilizada para crear la tabla externa. También puede conservar los nombres originales de las columnas de clave principal y de atributos de Tablestore según sus necesidades.

Si necesita calcular los mismos datos varias veces, impórtelos de Tablestore a una tabla interna de MaxCompute. Así evitará leerlos desde Tablestore cada vez que ejecute un cálculo. Ejemplo:

CREATE TABLE internal_orders AS
SELECT odps_orderkey, odps_orderdate, odps_custkey, odps_totalprice
FROM ots_table_external
WHERE odps_orderkey > 5000 ;

internal_orders es una tabla de MaxCompute que admite todas las funciones de una tabla interna de este servicio. Utiliza un almacenamiento en columnas comprimido de forma eficiente y contiene macrodatos internos completos, además de información estadística. Al estar almacenada en MaxCompute, el acceso a internal_orders es más rápido que a una tabla de Tablestore. Este método resulta adecuado para datos que requieren múltiples cálculos.

Exportar datos de MaxCompute a Tablestore

Nota

MaxCompute no crea automáticamente la tabla de destino en Tablestore. Antes de exportar datos, asegúrese de que la tabla ya existe. De lo contrario, se generará un error.

Se creó una tabla externa llamada ots_table_external para permitir que MaxCompute acceda a la tabla ots_tpch_orders en Tablestore. Los datos se almacenan en una tabla interna de MaxCompute denominada internal_orders. Si desea procesar los datos de internal_orders y luego escribirlos de nuevo en Tablestore, ejecute la instrucción insert overwrite table sobre la tabla externa. Ejemplo:

INSERT OVERWRITE TABLE ots_table_external
SELECT odps_orderkey, odps_orderdate, odps_custkey, CONCAT(odps_custkey, 'SHIPPED'), CEIL(odps_totalprice)
FROM internal_orders;
Nota

Si los datos de la tabla interna de MaxCompute están ordenados por claves principales, se escriben en una sola partición de la tabla de Tablestore. En ese caso, no podrá aprovechar por completo las operaciones de escritura distribuida. Para este escenario, se recomienda usar distribute by rand() y distribuir los datos de forma aleatoria. Ejemplo:

INSERT OVERWRITE TABLE ots_table_external
SELECT odps_orderkey, odps_orderdate, odps_custkey, CONCAT(odps_custkey, 'SHIPPED'), CEIL(odps_totalprice)
FROM (SELECT * FROM internal_orders DISTRIBUTE BY rand()) t;

Tablestore es un servicio de almacenamiento de datos NoSQL que guarda la información en formato de pares clave-valor. Los datos que exporta MaxCompute afectan únicamente las filas que contienen las claves principales de la tabla de Tablestore. En este ejemplo, solo se modifican las filas que incluyen odps_orderkey y odps_orderdate. Además, solo se actualizan las columnas de atributos especificadas al crear la tabla ots_table_external; las columnas que no forman parte de la tabla externa permanecen sin cambios.

Nota
  • Si el tamaño de los datos que intenta escribir de MaxCompute a Tablestore en una sola operación supera los 4 MB, podría producirse un error. En tal caso, elimine los datos excedentes y vuelva a escribir en Tablestore.

    ODPS-0010000:System internal error - Output to TableStore failed with exception:
    TableStore BatchWrite request id XXXXX failed with error code OTSParameterInvalid and message:The total data size of BatchWriteRow request exceeds the limit
  • Escribir varios registros de datos al mismo tiempo o por fila se considera una única operación. Para obtener más información, consulte BatchWriteRow. Si necesita escribir grandes volúmenes de datos a la vez, escríbalos por fila.

  • Si va a escribir varios registros de datos simultáneamente, asegúrese de no incluir filas duplicadas. De existir duplicados, podría presentarse el siguiente error:

    ErrorCode: OTSParameterInvalid, ErrorMessage: The input parameter is invalid 

    Para obtener más información, consulte Error OTSParameterInvalid al usar BatchWriteRow para enviar 100 registros de datos a la vez.

  • Dado que Tablestore es un servicio de almacenamiento de pares clave-valor, al usar insert overwrite table para escribir datos en una tabla de Tablestore, no se borra todo el contenido de la tabla de destino. Solo se sobrescriben los valores de las claves que coinciden con las de la tabla de origen.

Ejemplos de procesamiento de datos dañados

  1. Cree una tabla de Tablestore llamada mf_ots_test y prepare los datos. Para obtener más información, consulte Quick Start for wide table model.

    En el siguiente código de ejemplo se muestran los datos predeterminados de la tabla de Tablestore.

    +----+-----------+---------------------------+
    | id | name      | desc                      |
    +----+-----------+---------------------------+
    | 1  | Zhang San | Zhang San's description   |
    +----+-----------+---------------------------+
  2. Cree una tabla externa de MaxCompute.

    CREATE EXTERNAL TABLE IF NOT EXISTS mf_ots_external_permi
    (
     id string,
    	name bigint,
    	desc string,
    	corrupt_col string
    )
    STORED BY 'com.aliyun.odps.TableStoreStorageHandler'
    WITH SERDEPROPERTIES (
      'tablestore.columns.mapping'=':id,name,desc',
      'tablestore.table.name'='mf_ots_test',
      'tablestore.read.mode'='permissive',
      'tablestore.corrupt.column'='corrupt_col',
      'odps.properties.rolearn'='acs:ram::139699392458****:role/aliyunodpsdefaultrole'
    )
    LOCATION 'tablestore://santie-doc.cn-shanghai.ots-internal.aliyuncs.com';
  3. Ejecute el siguiente código para consultar los datos de la tabla externa de MaxCompute:

    -- Query data
    SELECT * FROM mf_ots_external_permi;

    Se devuelve el siguiente resultado. El campo con errores se escribe en la columna corrupt_col en formato JSON.

    +------------+------------+--------------------------+------------------------+
    | id         | name       | desc                     | corrupt_col            |
    +------------+------------+--------------------------+------------------------+
    | 1          | NULL       | Description of Zhang San | {"name": "\"Zhang San\""} |
    +------------+------------+--------------------------+------------------------+
    Nota

    Si no configura tablestore.read.mode o lo establece en permissive, pero no define tablestore.corrupt.column para indicar dónde escribir los datos dañados, recibirá el mensaje de error "Columns not match with columns mapping and corrupt column" al consultar la tabla externa.

Preguntas frecuentes

¿Cómo resuelvo la lentitud de los trabajos SQL en tablas externas de Tablestore?

  • Consultas lentas en tablas externas de Tablestore

    • Síntoma

      Las consultas en una tabla externa de Tablestore tardan demasiado. Para los mismos datos de negocio, una copia se escribe en tiempo real en Tablestore y otra de forma programada en MaxCompute. Los esquemas de las tablas y los volúmenes de datos son idénticos. Sin embargo, una consulta en la tabla interna de MaxCompute es mucho más rápida que en la tabla externa de Tablestore.

    • Solución

      Este problema suele presentarse cuando ejecuta varios cálculos sobre el mismo conjunto de datos. En lugar de leer los datos de Tablestore en cada consulta, un método más eficiente consiste en importarlos a una tabla interna de MaxCompute y ejecutar ahí las consultas.

  • Búsquedas de datos lentas en tablas externas de MaxCompute mediante un SDK

    • Síntoma

      Las búsquedas de datos en una tabla externa de MaxCompute realizadas con un kit de desarrollo de software (SDK) presentan un rendimiento lento.

    • Solución

      Las tablas externas solo admiten exploraciones completas de tabla, lo cual puede afectar el rendimiento. Utilice una tabla interna de MaxCompute en su lugar.