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
Tiene los permisos necesarios para acceder a Tablestore. Para obtener más información sobre la autorización, consulte STS authorization for Tablestore.
Ya creó una instancia, una tabla y los datos correspondientes en Tablestore. Para obtener más información, consulte Quick Start for wide table model.
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ámetroodps.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.
|
tablestore.table.name | Sí | Nombre de la tabla de Tablestore a la que desea que acceda MaxCompute. En este ejemplo, el nombre es |
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.
|
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:
|
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:
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:
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. |
tablestore.read.mode | No | Indica el comportamiento de lectura cuando MaxCompute detecta datos dañados en la tabla externa de Tablestore. Valores válidos:
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.
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>;
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;
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
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;
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.
-
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 invalidPara 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 tablepara 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
-
Cree una tabla de Tablestore llamada
mf_ots_testy 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 | +----+-----------+---------------------------+ -
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'; -
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_colen formato JSON.+------------+------------+--------------------------+------------------------+ | id | name | desc | corrupt_col | +------------+------------+--------------------------+------------------------+ | 1 | NULL | Description of Zhang San | {"name": "\"Zhang San\""} | +------------+------------+--------------------------+------------------------+NotaSi 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.
-