DataWorks Data Integration proporciona el plugin MongoDB Reader para leer datos de MongoDB y sincronizarlos con otros orígenes de datos. Este tutorial le muestra cómo sincronizar datos por lotes desde MongoDB hacia MaxCompute.
Contexto
El origen de datos es MongoDB y el destino es MaxCompute. Antes de empezar, prepare los datos en MongoDB y cree una tabla de destino en MaxCompute.
Requisitos previos
Asegúrese de cumplir con los siguientes requisitos:
Activó DataWorks y creó un origen de datos de MaxCompute.
-
Este tutorial utiliza un resource group exclusivo para Data Integration con el fin de ejecutar la tarea por lotes. Debe comprar y configurar un resource group exclusivo para Data Integration. Para obtener más información, consulte Use an exclusive resource group for Data Integration.
NotaTambién puede usar un resource group serverless. Para obtener más información, consulte Use a serverless resource group.
Preparación de datos y tablas de ejemplo
Prepare una colección de MongoDB y una tabla de MaxCompute para la sincronización por lotes.
-
Prepare una colección de MongoDB.
Este tutorial usa ApsaraDB for MongoDB como ejemplo. A continuación se muestra el código para preparar la colección de MongoDB.
-
Cree una colección llamada
di_mongodb_conf_test.db.createCollection('di_mongodb_conf_test') -
Inserte los datos de ejemplo de este tutorial en la colección.
db.di_mongodb_conf_test.insertOne({ 'col_string':'mock string value', 'col_int32':NumberInt("1"), 'col_int32_min':NumberInt("-2147483648"), 'col_int32_max':NumberInt("2147483647"), 'col_int64':NumberLong("1234567890123456"), 'col_int64_min':NumberLong("-9223372036854775807"), 'col_int64_max':NumberLong("9223372036854775807"), 'col_decimal':NumberDecimal("9999999.4999999999"), 'col_double':9999999.99, 'col_boolean':true, 'col_timestamp':ISODate(), 'col_date':new Date(), 'col_array_to_json':['a','b'], 'col_array_to_join':['a','b'], 'col_doc':{ 'key_string':'mock string value', 'key_int32':NumberInt("1"), 'key_int32_min':NumberInt("-2147483648"), 'key_int32_max':NumberInt("2147483647"), 'key_int64':NumberLong("1234567890123456"), 'key_int64_min':NumberLong("-9223372036854775807"), 'key_int64_max':NumberLong("9223372036854775807"), 'key_decimal':NumberDecimal("9999999.4999999999"), 'key_double':9999999.99, 'key_boolean':true, 'key_timestamp':ISODate(), 'key_date':new Date(), 'key_array_to_json':['a','b'], 'key_array_to_join':['a','b'], }, 'col_extra_1':'this is extra 1', 'col_extra_2':'this is extra 2', }) -
Consulte los datos insertados en MongoDB.
db.getCollection("di_mongodb_conf_test").find({})El resultado de la consulta muestra un documento de prueba en la colección, cuyo
_ides63dca714b8548a78e1dc3238. Este documento contiene diversos tipos de datos: cadena (col_string), entero (col_int32/col_int64), punto flotante (col_double/col_decimal), booleano (col_boolean), fecha y hora (col_date/col_timestamp) y arreglo (col_array_to_join/col_array_to_json). También incluye un documento anidado,col_doc, y dos campos adicionales,col_extra_1ycol_extra_2.
-
-
Prepare una tabla de MaxCompute.
-
Cree una tabla particionada llamada
di_mongodb_conf_testconptcomo campo de partición.CREATE TABLE IF NOT EXISTS di_mongodb_conf_test ( `id` STRING ,`col_string` STRING ,`col_int32` INT ,`col_int32_min` INT ,`col_int32_max` INT ,`col_int64` BIGINT ,`col_int64_min` BIGINT ,`col_int64_max` BIGINT ,`col_decimal` DECIMAL(38,18) ,`col_double` DOUBLE ,`col_boolean` BOOLEAN ,`col_timestamp` TIMESTAMP ,`col_date` DATE ,`col_array_to_json` STRING ,`col_array_to_join` STRING ,`key_string` STRING ,`key_int32` INT ,`key_int32_min` INT ,`key_int32_max` INT ,`key_int64` BIGINT ,`key_int64_min` BIGINT ,`key_int64_max` BIGINT ,`key_decimal` DECIMAL(38,18) ,`key_double` DOUBLE ,`key_boolean` BOOLEAN ,`key_timestamp` TIMESTAMP ,`key_date` DATE ,`key_array_to_json` STRING ,`key_array_to_join` STRING ,`col_doc` STRING ,`col_combine` STRING ) PARTITIONED BY ( pt STRING ) LIFECYCLE 36500 ; -
Agregue una partición con el valor
20230202.alter table di_mongodb_conf_test add if not exists partition (pt='20230202'); -
Compruebe que la tabla particionada se haya creado correctamente.
SELECT*FROM di_mongodb_conf_test WHEREpt='20230202';
-
Configuración de la tarea de sincronización por lotes
Paso 1: Agregar un origen de datos de MongoDB
Agregue un origen de datos de MongoDB y asegúrese de que exista conectividad de red entre dicho origen y el resource group exclusivo para Data Integration. Para obtener más información, consulte Add a MongoDB data source.
Paso 2: Crear y configurar un nodo de sincronización por lotes
En DataWorks DataStudio, cree un nodo de sincronización por lotes y configure su origen y destino. A continuación se destacan únicamente los parámetros clave; para los demás, utilice los valores predeterminados. Para consultar las instrucciones detalladas, consulte Configure a batch synchronization node using the Codeless UI.
-
Configure la conexión de red.
Seleccione los orígenes de datos de MongoDB y MaxCompute junto con el resource group exclusivo correspondiente para Data Integration. Después, pruebe la conectividad.
-
Configure la tarea: seleccione los orígenes de datos.
Para el origen y el destino, seleccione la colección de MongoDB y la tabla particionada de MaxCompute.
-
Configure la tarea: asigne los campos.
Cuando el origen de datos es MongoDB, se utiliza de forma predeterminada la opción Map Fields in Same Row. También puede hacer clic en el ícono
para editar manualmente los campos de la tabla de origen. A continuación se muestra un ejemplo de edición manual.{"name":"_id","type":"string"} {"name":"col_string","type":"string"} {"name":"col_int32","type":"long"} {"name":"col_int32_min","type":"long"} {"name":"col_int32_max","type":"long"} {"name":"col_int64","type":"long"} {"name":"col_int64_min","type":"long"} {"name":"col_int64_max","type":"long"} {"name":"col_decimal","type":"double"} {"name":"col_double","type":"double"} {"name":"col_boolean","type":"boolean"} {"name":"col_timestamp","type":"date"} {"name":"col_date","type":"date"} {"name":"col_array_to_json","type":"string"} {"name":"col_array_to_join","type":"array","splitter":","} {"name":"col_doc.key_string","type":"document.string"} {"name":"col_doc.key_int32","type":"document.long"} {"name":"col_doc.key_int32_min","type":"document.long"} {"name":"col_doc.key_int32_max","type":"document.long"} {"name":"col_doc.key_int64","type":"document.long"} {"name":"col_doc.key_int64_min","type":"document.long"} {"name":"col_doc.key_int64_max","type":"document.long"} {"name":"col_doc.key_decimal","type":"document.double"} {"name":"col_doc.key_double","type":"document.double"} {"name":"col_doc.key_boolean","type":"document.boolean"} {"name":"col_doc.key_timestamp","type":"document.date"} {"name":"col_doc.key_date","type":"document.date"} {"name":"col_doc.key_array_to_json","type":"document"} {"name":"col_doc.key_array_to_join","type":"document.array","splitter":","} {"name":"col_doc","type":"string"} {"name":"col_combine","type":"combine"}Una vez editados los campos, la interfaz muestra la asignación entre los campos de origen y de destino.
Paso 3: Confirmar y desplegar el nodo
Si utiliza un espacio de trabajo en modo estándar y desea programar esta tarea, confirme y despliegue el nodo en el entorno de producción. Para obtener más información, consulte Deploy tasks.
Paso 4: Ejecutar el nodo y consultar el resultado
Después de configurar el nodo, ejecútelo. Cuando finalice la tarea, consulte los datos sincronizados en la tabla de MaxCompute. Los datos sincronizados incluyen los siguientes campos y valores: col_string (mock string value), col_int32 (1), col_int32_min (-2147483648), col_int32_max (2147483647), col_int64 (1234567890123456), col_decimal (9999999.4999999999), col_double (9999999.99), col_boolean (true), col_timestamp (2023-02-03 14:17:56.554), col_date (2023-02-03), col_array_to_json ([a, b]), col_array_to_join (a,b) y pt (20230202). Algunos campos numéricos se almacenan como texto. Los valores de los campos complejos son los siguientes:
-
El contenido del campo
col_doces el siguiente.{ "key_array_to_join": [ "a", "b" ], "key_array_to_json": [ "a", "b" ], "key_boolean": true, "key_date": "2023-02-03 14:17:56", "key_decimal": { "finite": true, "high": 34711494127958097792, "infinite": false, "low": 99999994999999999, "naN": false, "negative": false }, "key_double": 9999999.99, "key_int32": 1, "key_int32_max": 2147483647, "key_int32_min": -2147483648, "key_int64": 1234567890123456, "key_int64_max": 9223372036854775807, "key_int64_min": -9223372036854775807, "key_string": "mock string value", "key_timestamp": "2023-02-03 14:17:56" } -
El contenido del campo
col_combinees el siguiente.{ "col_extra_1": "this is extra 1", "col_extra_2": "this is extra 2" }
Para obtener información sobre problemas relacionados con la salida de datos de tipo Decimal, consulte Appendix 2: Handle the output of the Decimal type in documents.
Apéndice 1: Conversión de formatos de datos
Convertir datos de arreglo a formato JSON: col_array_to_json
|
Datos de origen de MongoDB |
Configuración de asignación de campos |
Salida en MaxCompute |
|
En la configuración de asignación de campos, si |
|
Convertir un arreglo en una cadena concatenada: col_array_to_join
|
Datos de origen de MongoDB |
Configuración de asignación de campos |
Salida en MaxCompute |
|
Al configurar la asignación de campos, el parámetro |
|
Sincronizar campos de documentos anidados
|
Datos de origen de MongoDB |
Configuración de asignación de campos |
Salida en MaxCompute |
|
|
|
Serializar un documento como cadena JSON
|
Datos de origen de MongoDB |
Configuración de asignación de campos |
Salida en MaxCompute |
|
Al configurar la asignación de campos, si |
|
Serializar campos no asignados como JSON
|
Datos de origen de MongoDB |
Configuración de asignación de campos |
Salida en MaxCompute |
|
Este documento tiene cuatro campos. |
|
Apéndice 2: Salida del tipo Decimal
Cuando un documento se serializa a JSON, los datos Decimal128 se generan de forma predeterminada con el siguiente formato:
{
"key_decimal":
{
"finite": true,
"high": 3471149412795809792,
"infinite": false,
"low": 99999994999999999,
"naN": false,
"negative": false
}
}
Para generar los datos como un tipo numérico, siga estos pasos:
Al configurar la tarea de sincronización por lotes, cambie al modo de script.
-
Modifique la configuración de la tarea Reader: en la sección de parámetros, agregue el parámetro
decimal128OutputTypey establezca su valor enbigDecimal."parameter": { "collectionName": "di_mongodb_conf_test", "decimal128OutputType":"bigDecimal" }, "name": "Reader", "category": "reader" -
Ejecute de nuevo la tarea de sincronización por lotes y consulte el resultado.
{ "key_decimal": "9999999.4999999999" }