Partilhar via


Mapeamento de esquema e tipo de dados na atividade de cópia

APLICA-SE A: Azure Data Factory Azure Synapse Analytics

Gorjeta

Experimente o Data Factory no Microsoft Fabric, uma solução de análise tudo-em-um para empresas. O Microsoft Fabric abrange tudo, desde a movimentação de dados até ciência de dados, análises em tempo real, business intelligence e relatórios. Saiba como iniciar uma nova avaliação gratuitamente!

Este artigo descreve como a atividade de cópia do Azure Data Factory executa o mapeamento de esquema e o mapeamento de tipos de dados desde os dados de origem até os dados de destino.

Mapeamento de esquema

Mapeamento padrão

Por padrão, a atividade de cópia mapeia os dados de origem para o destino por nomes de coluna de forma sensível a maiúsculas e minúsculas. Se o destino não existir, por exemplo, ao gravar em ficheiro(s), os nomes dos campos de origem serão mantidos como nomes de destino. Se o coletor já existir, ele deve conter todas as colunas que estão sendo copiadas da fonte. Esse mapeamento padrão suporta esquemas flexíveis e desvio de esquema da origem para o destino ao longo das execuções - todos os dados retornados pelo armazenamento de dados de origem podem ser copiados para o destino.

Se a fonte for um arquivo de texto sem linha de cabeçalho, o mapeamento explícito será necessário, pois a fonte não contém nomes de coluna.

Mapeamento explícito

Você também pode especificar o mapeamento explícito para personalizar o mapeamento de coluna/campo da origem para o coletor com base em sua necessidade. Com o mapeamento explícito, você pode copiar apenas dados de origem parciais para coletor, mapear dados de origem para coletor com nomes diferentes ou remodelar dados tabulares/hierárquicos. Atividade de cópia:

  1. Lê os dados da origem e determina o esquema de origem.
  2. Aplica o mapeamento definido.
  3. Grava os dados no coletor.

Saiba mais sobre:

Você pode configurar o mapeamento na tabulação de mapeamento da Authoring UI -> copy activity ->, ou especificar programaticamente o mapeamento na propriedade da copy activity ->translator. As propriedades a seguir são suportadas em translator ->mappings array -> objects ->source e sink, que aponta para a coluna/campo específico para mapear dados.

Propriedade Descrição Obrigatório
nome Nome da coluna/campo de origem ou coletor. Solicite a fonte tabular e o coletor. Sim
Ordinal Índice da coluna. Comece a partir de 1.
É necessário aplicar ao usar texto delimitado sem linha de cabeçalho.
Não
path Expressão de caminho JSON para cada campo a ser extraído ou mapeado. Utilize uma fonte hierárquica e um destino, como conectores do Azure Cosmos DB, MongoDB ou REST.
Para campos sob o objeto raiz, o caminho JSON começa com root $; para campos dentro da matriz escolhida pela collectionReference propriedade, o caminho JSON começa a partir do elemento array sem $.
Não
tipo Tipo de dados provisórios da coluna de origem ou coletor. Em geral, não é necessário especificar ou alterar esta propriedade. Saiba mais sobre o mapeamento de tipo de dados. Não
cultura Cultura da coluna de fonte ou sumidouro. Aplique quando o tipo for Datetime ou Datetimeoffset. A predefinição é en-us.
Em geral, não é necessário especificar ou alterar esta propriedade. Saiba mais sobre o mapeamento de tipo de dados.
Não
formato Formatar cadeia de caracteres a ser usada quando o tipo é Datetime ou Datetimeoffset. Consulte Custom Date and Time Format Strings para saber como formatar data e hora. Em geral, não é necessário especificar ou alterar essa propriedade. Saiba mais sobre o mapeamento de tipo de dados. Não

As seguintes propriedades são suportadas em translator , além de mappings:

Propriedade Descrição Obrigatório
collectionReference Aplique ao copiar dados de uma fonte hierárquica, como conectores Azure Cosmos DB, MongoDB ou REST.
Se você quiser iterar e extrair dados dos objetos dentro de um campo de matriz com o mesmo padrão e converter para por linha por objeto, especifique o caminho JSON dessa matriz para fazer aplicação cruzada.
Não

Origem tabular para destino tabular

Por exemplo, para copiar dados do Salesforce para o Banco de Dados SQL do Azure e mapear explicitamente três colunas:

  1. Na aba de mapeamento da Atividade de cópia ->, clique no botão Importar esquemas para importar esquemas tanto de origem quanto de destino.

  2. Mapeie os campos necessários e exclua o resto.

Mapear tabular para tabular

O mesmo mapeamento pode ser configurado como o seguinte na carga útil da atividade de cópia (consulte translator):

{
    "name": "CopyActivityTabularToTabular",
    "type": "Copy",
    "typeProperties": {
        "source": { "type": "SalesforceSource" },
        "sink": { "type": "SqlSink" },
        "translator": {
            "type": "TabularTranslator",
            "mappings": [
                {
                    "source": { "name": "Id" },
                    "sink": { "name": "CustomerID" }
                },
                {
                    "source": { "name": "Name" },
                    "sink": { "name": "LastName" }
                },
                {
                    "source": { "name": "LastModifiedDate" },
                    "sink": { "name": "ModifiedDate" }
                }
            ]
        }
    },
    ...
}

Para copiar dados de arquivos de texto delimitados sem linha de cabeçalho, as colunas são representadas por ordinal em vez de nomes.

{
    "name": "CopyActivityTabularToTabular",
    "type": "Copy",
    "typeProperties": {
        "source": { "type": "DelimitedTextSource" },
        "sink": { "type": "SqlSink" },
        "translator": {
            "type": "TabularTranslator",
            "mappings": [
                {
                    "source": { "ordinal": "1" },
                    "sink": { "name": "CustomerID" }
                }, 
                {
                    "source": { "ordinal": "2" },
                    "sink": { "name": "LastName" }
                }, 
                {
                    "source": { "ordinal": "3" },
                    "sink": { "name": "ModifiedDate" }
                }
            ]
        }
    },
    ...
}

Origem hierárquica para coletor tabular

Ao copiar dados da origem hierárquica para o coletor tabular, a atividade de cópia oferece suporte aos seguintes recursos:

  • Extraia dados de objetos e matrizes.
  • Aplicar cruzadamente múltiplos objetos com o mesmo padrão a partir de um array, no caso de converter um objeto JSON em vários registos no resultado tabular.

Para uma transformação hierárquica em tabular mais avançada, você pode usar o Fluxo de Dados.

Por exemplo, se você tiver um documento MongoDB de origem com o seguinte conteúdo:

{
    "id": {
        "$oid": "592e07800000000000000000"
    },
    "number": "01",
    "date": "20170122",
    "orders": [
        {
            "prod": "p1",
            "price": 23
        },
        {
            "prod": "p2",
            "price": 13
        },
        {
            "prod": "p3",
            "price": 231
        }
    ],
    "city": [ { "name": "Seattle" } ]
}

E você deseja copiá-lo para um arquivo de texto no seguinte formato com linha de cabeçalho, nivelando os dados dentro da matriz (order_pd e order_price) e cruzando com as informações de raiz comuns (número, data e cidade):

Número da encomenda orderDate order_pd preço do pedido cidade
01 20170122 P1 23 Seattle
01 20170122 P2 13 Seattle
01 20170122 P3 231 Seattle

Você pode definir esse mapeamento na interface do usuário de criação do Data Factory:

  1. Na aba Atividade de cópia -> mapeamento, clique no botão Importar esquemas para importar esquemas de origem e de destino. À medida que o serviço obtém amostras dos principais objetos ao importar o esquema, se algum campo não aparecer, você poderá adicioná-lo à camada correta na hierarquia - passe o mouse sobre um nome de campo existente e escolha adicionar um nó, um objeto ou uma matriz.

  2. Selecione a matriz da qual deseja iterar e extrair dados. Ele será preenchido automaticamente como referência de coleção. Observe que apenas uma única matriz é suportada para essa operação.

  3. Mapeie os campos necessários para afundar. O serviço determina automaticamente os caminhos JSON correspondentes para o lado hierárquico.

Nota

Para registros em que a matriz marcada como referência de coleção está vazia e a caixa de seleção está marcada, o registro inteiro é ignorado.

Mapear estrutura hierárquica para formato tabular usando a UI

Você também pode alternar para o editor Avançado, caso em que você pode ver e editar diretamente os caminhos JSON dos campos. Se você optar por adicionar um novo mapeamento nessa exibição, especifique o caminho JSON.

Converter estrutura hierárquica em tabular usando editor avançado

O mesmo mapeamento pode ser configurado da seguinte forma na carga útil da atividade de cópia (consulte translator):

{
    "name": "CopyActivityHierarchicalToTabular",
    "type": "Copy",
    "typeProperties": {
        "source": { "type": "MongoDbV2Source" },
        "sink": { "type": "DelimitedTextSink" },
        "translator": {
            "type": "TabularTranslator",
            "mappings": [
                {
                    "source": { "path": "$['number']" },
                    "sink": { "name": "orderNumber" }
                },
                {
                    "source": { "path": "$['date']" },
                    "sink": { "name": "orderDate" }
                },
                {
                    "source": { "path": "['prod']" },
                    "sink": { "name": "order_pd" }
                },
                {
                    "source": { "path": "['price']" },
                    "sink": { "name": "order_price" }
                },
                {
                    "source": { "path": "$['city'][0]['name']" },
                    "sink": { "name": "city" }
                }
            ],
            "collectionReference": "$['orders']"
        }
    },
    ...
}

Fonte tabular/hierárquica para coletor hierárquico

O fluxo da experiência do utilizador é semelhante à origem hierárquica para destino tabular.

Ao copiar dados da fonte tabular para o coletor hierárquico, não há suporte para gravação na matriz dentro do objeto.

Ao copiar dados da fonte hierárquica para o destino hierárquico, você também pode preservar toda a hierarquia da camada, selecionando o objeto/array e mapeando para o destino sem alterar os campos internos.

Para uma transformação de remodelação de dados mais avançada, você pode usar o Fluxo de Dados.

Parametrizar mapeamento

Se quiser criar um pipeline templatizado para copiar dinamicamente um grande número de objetos, determine se pode aproveitar o mapeamento padrão ou se precisa definir o mapeamento explícito para os respetivos objetos.

Se o mapeamento explícito for necessário, você pode:

  1. Defina um parâmetro com o tipo de objeto no nível do pipeline, por exemplo, mapping.

  2. Parametrizar o mapeamento: na guia copiar atividade -> mapeamento, escolha adicionar conteúdo dinâmico e selecione o parâmetro acima. A carga útil da atividade seria a seguinte:

    {
        "name": "CopyActivityHierarchicalToTabular",
        "type": "Copy",
        "typeProperties": {
            "source": {...},
            "sink": {...},
            "translator": {
                "value": "@pipeline().parameters.mapping",
                "type": "Expression"
            },
            ...
        }
    }
    
  3. Construa o valor a ser passado para o parâmetro de mapeamento. Deve ser o objeto inteiro da definição de translator, consulte os exemplos na seção de mapeamento explícito. Por exemplo, para cópia de fonte tabular para destino tabular, o valor deve ser {"type":"TabularTranslator","mappings":[{"source":{"name":"Id"},"sink":{"name":"CustomerID"}},{"source":{"name":"Name"},"sink":{"name":"LastName"}},{"source":{"name":"LastModifiedDate"},"sink":{"name":"ModifiedDate"}}]}.

Mapeamento de tipos de dados

A atividade de cópia executa o mapeamento de tipos de origem para tipos de destino com o seguinte fluxo:

  1. Converta de tipos de dados nativos de origem para tipos de dados provisórios usados pelos pipelines do Azure Data Factory e Synapse.
  2. Converta automaticamente o tipo de dados intermediário conforme necessário para corresponder aos tipos de destino correspondentes, aplicável tanto para mapeamento padrão como para mapeamento explícito.
  3. Converta tipos de dados provisórios para tipos de dados nativos de destino.

Atualmente, a atividade de cópia suporta os seguintes tipos de dados provisórios: Boolean, Byte, Byte array, Datetime, DatetimeOffset, Decimal, Double, GUID, Int16, Int32, Int64, SByte, Single, String, Timespan, UInt16, UInt32 e UInt64.

As conversões de tipo de dados a seguir são suportadas entre os tipos provisórios da origem para o destino.

Fonte\Sumidouro booleano Matriz de bytes Data/Hora Decimal Ponto de flutuação GUID Número inteiro String TimeSpan
Booleano
Matriz de bytes
Data/Hora
Decimal
Ponto de flutuação
Identificador Globalmente Único (GUID)
Número inteiro
String
TimeSpan

(1) Data/Hora inclui DateTime, DateTimeOffset, Date e Time.

(2) Ponto flutuante inclui "Single" e "Double".

(3) O tipo Inteiro inclui SByte, Byte, Int16, UInt16, Int32, UInt32, Int64 e UInt64.

Nota

  • Atualmente, essa conversão de tipo de dados é suportada ao copiar entre dados tabulares. Não há suporte para fontes/coletores hierárquicos, o que significa que não há conversão de tipo de dados definido pelo sistema entre os tipos provisórios de origem e coletor.
  • Este recurso funciona com o modelo de conjunto de dados mais recente. Se você não vir essa opção na interface do usuário, tente criar um novo conjunto de dados.

As seguintes propriedades são suportadas na atividade de cópia para conversão de tipo de dados (na translator seção para criação programática):

Propriedade Descrição Obrigatório
tipoConversão Habilite a nova experiência de conversão de tipo de dados.
O valor padrão é falso, considerando a compatibilidade retroativa.

Para novas atividades de cópia criadas por meio da interface do usuário de criação do Data Factory desde o final de junho de 2020, essa conversão de tipo de dados é habilitada por padrão para a melhor experiência, e você pode ver as seguintes configurações de conversão de tipo na guia Atividade de cópia -> mapeamento para cenários aplicáveis.
Para criar um pipeline programaticamente, deve definir explicitamente a propriedade typeConversion como "true" para a habilitar.
Para atividades de cópia já existentes criadas antes do lançamento deste recurso, você não verá opções de conversão de tipo na interface de edição de modo a manter a compatibilidade com versões anteriores.
Não
configurações de conversão de tipo Um grupo de configurações de conversão de tipo. Aplique quando typeConversion estiver definido como true. As propriedades a seguir estão todas sob este grupo. Não
Em typeConversionSettings
allowDataTruncation Permitir o truncamento de dados ao converter dados da origem para o destino com tipo diferente durante a cópia, por exemplo, de decimal para inteiro, de DatetimeOffset para Datetime.
O valor predefinido é verdadeiro.
Não
tratarBooleanComoNúmero Trate booleanos como números, por exemplo, verdadeiros como 1.
O valor predefinido é falso.
Não
formato de data Formatar a string ao converter entre datas e strings, por exemplo, yyyy-MM-dd. Consulte Cadeias de caracteres de formato de data e hora personalizadas para obter informações detalhadas. Não
dateTimeFormat Formatar cadeia de caracteres ao converter entre datas sem deslocamento de fuso horário e cadeias de caracteres, por exemplo, yyyy-MM-dd HH:mm:ss.fff. Consulte Cadeias de caracteres de formato de data e hora personalizadas para obter informações detalhadas. Não
dateTimeOffsetFormat Formatar cadeia de caracteres ao converter entre datas com deslocamento de fuso horário e cadeias de caracteres, por exemplo, yyyy-MM-dd HH:mm:ss.fff zzz. Consulte Cadeias de caracteres de formato de data e hora personalizadas para obter informações detalhadas. Não
timeSpanFormat Formatar cadeia de caracteres ao converter entre períodos de tempo e cadeias de caracteres, por exemplo, dd\.hh\:mm. Consulte Custom TimeSpan Format Strings para obter informações detalhadas. Não
timeFormat Formatar a string ao converter entre valores de tempo e strings, por exemplo HH:mm:ss.fff. Consulte Cadeias de caracteres de formato de data e hora personalizadas para obter informações detalhadas. Não
cultura Informações de cultura a serem usadas ao converter tipos, por exemplo, en-us ou fr-fr. Não

Exemplo:

{
    "name": "CopyActivity",
    "type": "Copy",
    "typeProperties": {
        "source": {
        	"type": "ParquetSource"
        },
        "sink": {
            "type": "SqlSink"
        },
        "translator": {
            "type": "TabularTranslator",
            "typeConversion": true,
            "typeConversionSettings": {
                "allowDataTruncation": true,
                "treatBooleanAsNumber": true,
                "dateTimeFormat": "yyyy-MM-dd HH:mm:ss.fff",
                "dateTimeOffsetFormat": "yyyy-MM-dd HH:mm:ss.fff zzz",
                "timeSpanFormat": "dd\.hh\:mm",
                "culture": "en-gb"
            }
        }
	},
    ...
}

Modelos antigos

Nota

Os modelos a seguir para mapear colunas/campos de origem para coletor ainda são suportados, assim como para compatibilidade com versões anteriores. Sugerimos que você use o novo modelo mencionado no mapeamento de esquema. A interface de criação do utilizador passou a gerar o novo modelo.

Mapeamento alternativo de colunas (modelo herdado)

Você pode especificar a atividade de cópia ->translator ->columnMappings para mapear entre dados em forma de tabela. Neste caso, a seção "estrutura" é necessária para conjuntos de dados de entrada e saída. O mapeamento de colunas suporta o mapeamento de todas ou subconjuntos de colunas na "estrutura" do conjunto de dados de origem para todas as colunas na "estrutura" do conjunto de dados de destino. A seguir estão as condições de erro que resultam em uma exceção:

  • O resultado da consulta do armazenamento de dados de origem não tem um nome de coluna especificado na seção "estrutura" do conjunto de dados de entrada.
  • O armazenamento de dados do coletor (se estiver com esquema predefinido) não tem um nome de coluna especificado na seção "estrutura" do conjunto de dados de saída.
  • Existem menos ou mais colunas na "estrutura" do conjunto de dados de destino do que as especificadas no mapeamento.
  • Mapeamento duplicado.

No exemplo a seguir, o conjunto de dados de entrada tem uma estrutura e aponta para uma tabela em um banco de dados Oracle local.

{
    "name": "OracleDataset",
    "properties": {
        "structure":
         [
            { "name": "UserId"},
            { "name": "Name"},
            { "name": "Group"}
         ],
        "type": "OracleTable",
        "linkedServiceName": {
            "referenceName": "OracleLinkedService",
            "type": "LinkedServiceReference"
        },
        "typeProperties": {
            "tableName": "SourceTable"
        }
    }
}

Neste exemplo, o conjunto de dados de saída tem uma estrutura e aponta para uma tabela no Salesforce.

{
    "name": "SalesforceDataset",
    "properties": {
        "structure":
        [
            { "name": "MyUserId"},
            { "name": "MyName" },
            { "name": "MyGroup"}
        ],
        "type": "SalesforceObject",
        "linkedServiceName": {
            "referenceName": "SalesforceLinkedService",
            "type": "LinkedServiceReference"
        },
        "typeProperties": {
            "tableName": "SinkTable"
        }
    }
}

O JSON a seguir define uma atividade de cópia em um pipeline. As colunas da origem mapeadas para colunas no coletor usando a propriedade translator ->columnMappings .

{
    "name": "CopyActivity",
    "type": "Copy",
    "inputs": [
        {
            "referenceName": "OracleDataset",
            "type": "DatasetReference"
        }
    ],
    "outputs": [
        {
            "referenceName": "SalesforceDataset",
            "type": "DatasetReference"
        }
    ],
    "typeProperties":    {
        "source": { "type": "OracleSource" },
        "sink": { "type": "SalesforceSink" },
        "translator":
        {
            "type": "TabularTranslator",
            "columnMappings":
            {
                "UserId": "MyUserId",
                "Group": "MyGroup",
                "Name": "MyName"
            }
        }
    }
}

Se você estiver usando a sintaxe de para especificar o mapeamento de coluna, ela ainda será suportada "columnMappings": "UserId: MyUserId, Group: MyGroup, Name: MyName" no estado em que se encontra.

Mapeamento de esquema alternativo (modelo herdado)

Você pode especificar a atividade de cópia ->translator ->schemaMapping para mapear entre dados em forma hierárquica e dados em forma de tabela, por exemplo, copiar do MongoDB/REST para o arquivo de texto e copiar do Oracle para o Azure Cosmos DB para MongoDB. As seguintes propriedades são suportadas na seção de atividade translator de cópia:

Propriedade Descrição Obrigatório
tipo A propriedade tipo do tradutor de atividade de cópia deve ser definida como: TabularTranslator Sim
schemaMapping Uma coleção de pares chave-valor, que representa a relação de mapeamento do lado da origem para o lado do destino.
- Chave: representa a fonte. Para fonte tabular, especifique o nome da coluna conforme definido na estrutura do conjunto de dados; para fonte hierárquica, especifique a expressão de caminho JSON para cada campo a ser extraído e mapeado.
- Valor: representa a pia. Para coletor tabular, especifique o nome da coluna conforme definido na estrutura do conjunto de dados; para coletor hierárquico, especifique a expressão de caminho JSON para cada campo a ser extraído e mapeado.
No caso de dados hierárquicos, para campos sob objeto raiz, o caminho JSON começa com root $; para campos dentro da matriz escolhida pela collectionReference propriedade, o caminho JSON começa a partir do elemento da matriz.
Sim
collectionReference Se quiser iterar e extrair dados dos objetos dentro de um campo de array com o mesmo padrão e converter cada linha para cada objeto, especifique o caminho JSON desse array para realizar uma aplicação cruzada. Essa propriedade é suportada somente quando os dados hierárquicos são de origem. Não

Exemplo: cópia do MongoDB para o Oracle:

Por exemplo, se você tiver um documento MongoDB com o seguinte conteúdo:

{
    "id": {
        "$oid": "592e07800000000000000000"
    },
    "number": "01",
    "date": "20170122",
    "orders": [
        {
            "prod": "p1",
            "price": 23
        },
        {
            "prod": "p2",
            "price": 13
        },
        {
            "prod": "p3",
            "price": 231
        }
    ],
    "city": [ { "name": "Seattle" } ]
}

e você deseja copiá-lo para uma tabela SQL do Azure no seguinte formato, nivelando os dados dentro da matriz (order_pd e order_price) e realizando um cruzamento com as informações comuns de raiz (número, data e cidade):

Número da encomenda data de encomenda encomenda_pd order_price cidade
01 20170122 P1 23 Seattle
01 20170122 P2 13 Seattle
01 20170122 P3 231 Seattle

Configure a regra de mapeamento de esquema utilizando o seguinte exemplo JSON de uma atividade de cópia.

{
    "name": "CopyFromMongoDBToOracle",
    "type": "Copy",
    "typeProperties": {
        "source": {
            "type": "MongoDbV2Source"
        },
        "sink": {
            "type": "OracleSink"
        },
        "translator": {
            "type": "TabularTranslator",
            "schemaMapping": {
                "$.number": "orderNumber",
                "$.date": "orderDate",
                "prod": "order_pd",
                "price": "order_price",
                "$.city[0].name": "city"
            },
            "collectionReference":  "$.orders"
        }
    }
}

Veja os outros artigos da Atividade de cópia: