Condividi tramite


Attività di script in Data Factory e Azure Synapse Analytics

Questo articolo illustra come creare un'attività script in Azure Data Factory per eseguire query PostgreSQL personalizzate. Con l'attività script è possibile eseguire vari tipi di comandi PostgreSQL, ad esempio DML (Data Manipulation Language) e DDL (Data Definition Language), direttamente nelle pipeline.

Istruzioni DML:INSERT, UPDATE, DELETEe SELECT

Istruzioni DDL:CREATE, ALTERe DROP

Prerequisites

Creare un'attività script

  1. In Azure Data Factory Studio, selezionare l'hub Autore. Passare il puntatore del mouse sulla sezione Pipeline , selezionare ... a sinistra e selezionare Nuova pipeline per creare una nuova pipeline.

    Screenshot che mostra dove selezionare l'autore in Azure Data Factory.

    Screenshot che mostra dove selezionare una nuova pipeline.

  2. In Generale trascina e rilascia l'attività script nella pipeline.

    Screenshot che mostra dove selezionare l'attività script.

    1. Nella scheda Generale assegnare un nome all'attività script.

    Screenshot che mostra una casella per specificare un nome per l'attività dello script.

  3. Passare alla scheda Impostazioni e selezionare il servizio collegato Database di Azure per PostgreSQL o crearne uno nuovo. Dopo l'aggiunta, selezionare Test connessione per verificare che la connessione sia valida.

    Screenshot che mostra un esempio di impostazione del servizio collegato.

  4. Selezionare l'opzione Query o NonQuery a seconda dello script.

    L'attività script supporta sia istruzioni query che nonquery.

    Screenshot che evidenzia i pulsanti di opzione Query e Non query.

    Le istruzioni di query eseguono istruzioni PostgreSQL che restituiscono risultati. Spesso istruzioni SELECT. Un'istruzione "Query" restituisce i record di dati.

    Screenshot che mostra un esempio di script di query.

    Esempio di un payload con una query.

    {
        "name": "Sample of select statement",
        "type": "Script",
        "dependsOn": [],
        "policy": {
            "timeout": "1.12:00:00",
            "retry": 0,
            "retryIntervalInSeconds": 30,
            "secureOutput": false,
            "secureInput": false
        },
        "userProperties": [],
        "linkedServiceName": {
            "referenceName": "AzurePostgreSQL",
            "type": "LinkedServiceReference"
        },
        "typeProperties": {
            "scripts": [
                {
                    "type": "Query",
                    "text": "SELECT * FROM sample_table WHERE sample_int = 100; "
                }
            ],
            "scriptBlockExecutionTimeout": "02:00:00"
        }
    }
    

Creare più script all'interno di un'attività di script

È possibile includere più query in un'attività script selezionando il + segno accanto a Script per aggiungere un nuovo input di script.

Screenshot che mostra un esempio di creazione di una nuova casella di input dello script.

Screenshot che mostra come aggiungere una nuova casella di input per il blocco di script.

È possibile eliminare le caselle di input delle query usando l'icona di eliminazione accanto a Script.

Screenshot che mostra come eliminare un blocco di script.

Ecco un esempio di payload con due query separate.

{
      "name": "Sample of multiple select statements",
      "type": "Script",
      "dependsOn": [],
      "policy": {
         "timeout": "1.12:00:00",
         "retry": 0,
         "retryIntervalInSeconds": 30,
         "secureOutput": false,
         "secureInput": false
      },
      "userProperties": [],
      "linkedServiceName": {
         "referenceName": "AzurePostgreSQL1",
         "type": "LinkedServiceReference"
      },
      "typeProperties": {
         "scripts": [
            {
                  "type": "Query",
                  "text": "SELECT * FROM sample_table WHERE sample_int = 100; "
            },
            {
                  "type": "Query",
                  "text": "SELECT * FROM sample_table WHERE sample_int > 250; "
            }
         ],
         "scriptBlockExecutionTimeout": "02:00:00"
      }
}

Parametri dello script

Important

Le istruzioni di query multiple che usano parametri di output non sono supportate. Suddividere tutte le query di output in blocchi di script separati all'interno della stessa attività script o diversa.

L'attività script supporta due tipi di parametri di script: parametri posizionali e parametri con nome. I parametri denominati usano il nome dei parametri e vengono specificati come @<name> nelle query. I parametri posizionali usano l'indice dei parametri e vengono specificati nella query in ordine come $<position number> con un indice iniziale pari a 1.

I parametri denominati usano un @ prefisso per il nome del parametro. Impostare i parametri denominati come parametri di output impostando il valore su Null con la casella Considera come null selezionata nell'interfaccia utente e con il payload lasciato vuoto o null. Il valore nel testo deve essere Null.

Screenshot che mostra un esempio di parametro di output in cui si presuppone che null sia selezionato nell'interfaccia utente.

Il nome impostato all'interno della routine per l'output è il nome usato nell'output dei dati resultSets . Il nome impostato nella riga di output dell'interfaccia utente viene usato per il nome di outputParameters.

Risultato di esempio dall'esecuzione dell'interfaccia utente

"resultSetCount": 1,
"recordsAffected": 0,
"resultSets": [
   {
      "rowCount": 1,
      "rows": [
         {
            "output1": 10,
            "output2": "\"Hello World\""
         }
      ]
   }
],
"outputParameters": {
   "output10": 10,
   "output20": "\"Hello World\""
}

Esempio di payload per il parametro di output.

"scripts": [
  {
    "text": "CREATE OR REPLACE PROCEDURE swap_proc (input1 IN TEXT, input2 IN BIGINT, output1 OUT BIGINT, output2 OUT TEXT) LANGUAGE plpgsql AS $$ DECLARE BEGIN output2 := input1; output1 := input2; END $$",
    "type": "NonQuery"
  },
  {
    "text": "CALL swap_proc(@input1, @input2, null, null)",
    "type": "Query",
    "parameters": [
      {
        "name": "input1",
        "type": "String",
        "value": "Hello world",
        "direction": "Input",
        "size": 100
      },
      {
        "name": "input2",
        "type": "INT32",
        "value": 1234,
        "direction": "Input"
      },
      {
        "name": "output1",
        "type": "INT32",
        "direction": "Output"
      },
      {
        "name": "output2",
        "type": "String",
        "direction": "Output",
        "size": 100
      }
    ]
  }
]

Parametri posizionali

Important

Le istruzioni contenenti più query che utilizzano parametri posizionali non sono supportate. Assicurarsi che tutte le query con parametri posizionali si trovino in blocchi di script separati all'interno della stessa o diversa attività script.

Per usare i parametri posizionali, usare un segnaposto di $<positional number> nella query. Nei parametri il name campo deve essere lasciato vuoto nell'interfaccia utente e specificato come null nel payload.

"scripts": [
   {
      "text": "SELECT * FROM customers WHERE first_name = $1 AND age = $2;",
      "type": "Query",
      "parameters": [
        {
          "name": null,
          "type": "String",
          "value": "John",
          "direction": "Input",
          "size": 256
        },
        {
          "name": null,
          "type": "INT32",
          "value": 52,
          "direction": "Input"
        }
      ]
   }
]

Esempio di parametro posizionale valido

Screenshot che mostra un esempio di parametro posizionale valido.

"scripts": [
   {
      "text": "SELECT * FROM customers WHERE first_name = $1;",
      "type": "Query",
      "parameters": [
        {
          "name": null,
          "type": "String",
          "value": "John",
          "direction": "Input",
          "size": 256
        }
      ]
   },
   {
      "text": "SELECT * FROM customers WHERE age = $2;",
      "type": "Query",
      "parameters": [
        {
          "name": null,
          "type": "INT32",
          "value": 52,
          "direction": "Input"
        }
      ]
   }
]

Esempio di parametro posizionale non valido

"scripts": [
   {
      "text": "SELECT * FROM customers WHERE first_name = $1; SELECT * FROM customers WHERE age = $2;",
      "type": "Query",
      "parameters": [
        {
          "name": null,
          "type": "String",
          "value": "John",
          "direction": "Input",
          "size": 256
        },
        {
          "name": null,
          "type": "INT32",
          "value": 52,
          "direction": "Input"
        }
      ]
   }
]

Impostazioni avanzate

Le impostazioni avanzate nell'attività script di Azure Data Factory per PostgreSQL consentono di ottimizzare le opzioni di esecuzione e registrazione per i flussi di lavoro dei dati. È possibile impostare un timeout per il blocco di script per arrestare le query con esecuzione prolungata che influiscono sull'affidabilità della pipeline e attivare la registrazione dettagliata per tenere traccia degli avvisi e degli output delle attività di PostgreSQL. Queste funzionalità consentono di mantenere forti le operazioni dei dati e di offrire maggiore visibilità sulle esecuzioni della pipeline in Azure.

Timeout di esecuzione del blocco di script

Impostare un timeout in minuti per ogni esecuzione del blocco di script. Se un blocco di script nell'attività script supera il timeout, l'intera attività ha esito negativo.

Screenshot che mostra un'impostazione avanzata nell'attività script per impostare il timeout di esecuzione del blocco di script.

   "typeProperties": {
      "scripts": [
         {
               "type": "Query",
               "text": "SELECT pg_sleep(40);"
         },
         {
               "type": "Query",
               "text": "SELECT pg_sleep(40);"
         },
         {
               "type": "Query",
               "text": "SELECT pg_sleep(40);"
         }
      ],
      "scriptBlockExecutionTimeout": "00:01:00"
   }

Logging

Usare la registrazione per inviare avvisi di PostgreSQL a un'archiviazione Blob esterna o a una memoria interna.

Archiviazione esterna

Per la registrazione esterna, aprire la scheda Avanzate , quindi selezionare Abilita registrazione e Archiviazione esterna. È possibile aggiungere un account di archiviazione BLOB creando un nuovo servizio collegato per l'account di archiviazione BLOB. Facoltativamente, è possibile immettere un percorso di cartella. Se si lascia vuoto, i log vengono visualizzati nella cartella scriptactivity-logs .

Screenshot che mostra un esempio di registrazione esterna.

"typeProperties": {
   "scripts": [
      {
         "type": "Query",
         "text": "DO $$ BEGIN RAISE Notice 'Hello'; RAISE Notice 'World!'; END $$;"
      }
   ],
   "scriptBlockExecutionTimeout": "02:00:00",
   "logSettings": {
      "logDestination": "ExternalStore",
      "logLocationSettings": {
         "linkedServiceName": {
            "referenceName": "<Azure Blob Storage linked service name>",
            "type": "LinkedServiceReference"
         },
         "path": "<Azure Blob Storage folder path>"
      }
   }
}

Output dell'attività

Per la registrazione dell'output dell'attività, espandere la sezione Avanzate e selezionare Abilitare la registrazione e Output dell’attività. Queste opzioni attivano la registrazione nell'output dell'attività.

Screenshot che mostrano un esempio di registrazione dell'output dell'attività.

"typeProperties": {
   "scripts": [
      {
         "type": "Query",
         "text": "DO $$ BEGIN RAISE Notice 'Hello'; RAISE Notice 'World!'; END $$;"
      }
   ],
   "scriptBlockExecutionTimeout": "02:00:00",
   "logSettings": {
      "logDestination": "ActivityOutput"
   }
}