O DataWorks Data Integration oferece o plugin MongoDB Reader para ler dados do MongoDB e sincronizá-los com outras fontes de dados. Este tópico demonstra como usar o Data Integration para sincronizar dados em lote do MongoDB para o MaxCompute.
Contexto
Neste tutorial, a source é o MongoDB e o destino é o MaxCompute. Antes de começar, prepare os dados no MongoDB e crie uma tabela de destino no MaxCompute.
Pré-requisitos
Antes de iniciar, verifique se você atende aos seguintes requisitos:
Você ativou o DataWorks e criou uma fonte de dados do MaxCompute.
-
Este tutorial utiliza um grupo de recursos exclusivo para Data Integration na execução da tarefa em lote. Adquira e configure um grupo de recursos exclusivo para Data Integration. Para mais informações, consulte Usar um grupo de recursos exclusivo para Data Integration.
NotaTambém é possível utilizar um grupo de recursos serverless. Para mais informações, consulte Usar um grupo de recursos serverless.
Preparação dos dados e tabelas de exemplo
Este tutorial requer uma coleção do MongoDB e uma tabela do MaxCompute para a sincronização em lote.
-
Prepare uma coleção do MongoDB.
Este tutorial usa o ApsaraDB for MongoDB como exemplo. O código a seguir mostra como preparar a coleção do MongoDB.
-
Crie uma coleção chamada
di_mongodb_conf_test.db.createCollection('di_mongodb_conf_test') -
Insira os dados de exemplo deste tutorial na coleção.
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 os dados inseridos no MongoDB.
db.getCollection("di_mongodb_conf_test").find({})O resultado da consulta exibe um documento de teste na coleção, com
_idigual a63dca714b8548a78e1dc3238. Esse documento contém diversos tipos de dados: string (col_string), inteiro (col_int32/col_int64), ponto flutuante (col_double/col_decimal), booleano (col_boolean), data/hora (col_date/col_timestamp) e array (col_array_to_join/col_array_to_json). Ele também inclui um documento aninhado,col_doc, e dois campos extras,col_extra_1ecol_extra_2.
-
-
Prepare uma tabela do MaxCompute.
-
Crie uma tabela particionada chamada
di_mongodb_conf_testcomptcomo campo de partição.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 ; -
Adicione uma partição com o valor
20230202.alter table di_mongodb_conf_test add if not exists partition (pt='20230202'); -
Verifique se a tabela particionada foi criada corretamente.
SELECT*FROM di_mongodb_conf_test WHEREpt='20230202';
-
Configuração da tarefa de sincronização em lote
Etapa 1: Adicionar uma fonte de dados do MongoDB
Adicione uma fonte de dados do MongoDB e garanta a conectividade de rede entre essa fonte e o grupo de recursos exclusivo para Data Integration. Para mais informações, consulte Adicionar uma fonte de dados do MongoDB.
Etapa 2: Criar e configurar um nó de sincronização em lote
No DataWorks DataStudio, crie um nó de sincronização em lote e configure sua source e seu destino. Esta seção destaca os parâmetros principais; para os demais, utilize os valores padrão. Para instruções detalhadas, consulte Configurar um nó de sincronização em lote usando a Codeless UI.
-
Configure a conexão de rede.
Selecione as fontes de dados do MongoDB e do MaxCompute, o grupo de recursos exclusivo correspondente para Data Integration e, em seguida, teste a conectividade.
-
Configure a tarefa: selecione as fontes de dados.
Para source e destino, selecione a coleção do MongoDB e a tabela particionada do MaxCompute.
-
Configure a tarefa: mapeie os campos.
Quando a fonte de dados é o MongoDB, o Peer mapping é usado por padrão. Você também pode clicar em no ícone
para editar manualmente os campos da tabela de origem. O exemplo a seguir ilustra a edição 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"}Após editar os campos, a interface exibe o mapeamento entre os campos de origem e de destino.
Etapa 3: Confirmar e implantar o nó
Se você utiliza um workspace no modo padrão e deseja agendar esta tarefa, confirme e implante o nó no ambiente de produção. Para mais informações, consulte Implantar tarefas.
Etapa 4: Executar o nó e visualizar o resultado
Após configurar o nó, execute-o. Quando a tarefa for concluída, visualize os dados sincronizados na tabela do MaxCompute. Os dados sincronizados incluem os seguintes campos e 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) e pt (20230202). Alguns campos numéricos são armazenados como texto. Os valores dos campos complexos são os seguintes:
-
O conteúdo do campo
col_docé apresentado abaixo.{ "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" } -
O conteúdo do campo
col_combineé apresentado abaixo.{ "col_extra_1": "this is extra 1", "col_extra_2": "this is extra 2" }
Para informações sobre problemas relacionados à saída de dados do tipo Decimal, consulte Apêndice 2: Tratar a saída do tipo Decimal em documentos.
Apêndice 1: Conversão de formato de dados
Converter dados de array para formato JSON: col_array_to_json
|
Dados de source do MongoDB |
Configuração de mapeamento de campos |
Saída para o MaxCompute |
|
Na configuração de mapeamento de campos, se |
|
Converter um array em uma string concatenada: col_array_to_join
|
Dados de source do MongoDB |
Configuração de mapeamento de campos |
Saída para o MaxCompute |
|
Ao configurar o mapeamento de campos, o parâmetro |
|
Sincronizar campos de documentos aninhados
|
Dados de source do MongoDB |
Configuração de mapeamento de campos |
Saída para o MaxCompute |
|
|
|
Serializar um documento como string JSON
|
Dados de source do MongoDB |
Configuração de mapeamento de campos |
Saída para o MaxCompute |
|
Ao configurar o mapeamento de campos, se |
|
Serializar campos não mapeados como JSON
|
Dados de source do MongoDB |
Configuração de mapeamento de campos |
Saída para o MaxCompute |
|
Este documento possui quatro campos. |
|
Apêndice 2: Saída do tipo Decimal
Quando um documento é serializado para o formato JSON, os dados Decimal128 são, por padrão, gerados da seguinte forma:
{
"key_decimal":
{
"finite": true,
"high": 3471149412795809792,
"infinite": false,
"low": 99999994999999999,
"naN": false,
"negative": false
}
}
Para gerar os dados como um tipo numérico, siga estas etapas:
Ao configurar a tarefa de sincronização em lote, alterne para o modo script.
-
Modifique a configuração da tarefa Reader: na seção de parâmetros, adicione o parâmetro
decimal128OutputTypee defina seu valor comobigDecimal."parameter": { "collectionName": "di_mongodb_conf_test", "decimal128OutputType":"bigDecimal" }, "name": "Reader", "category": "reader" -
Execute novamente a tarefa de sincronização em lote e visualize o resultado.
{ "key_decimal": "9999999.4999999999" }