Passa al contenuto principale

Query parametrizzate con PySpark

Parameterized queries with PySpark

Pubblicato: 3 gennaio 2024

Open source6 min di lettura

PySpark ha sempre fornito eccellenti API SQL e Python per l'interrogazione dei dati. A partire da Databricks Runtime 15.2 e Apache Spark 4.0, le query parametrizzate supportano modi sicuri ed espressivi per interrogare i dati con SQL utilizzando paradigmi di programmazione Pythonic.

Questo post spiega come creare query parametrizzate con PySpark e quando questo è un buon modello di progettazione per il tuo codice.

I parametri sono utili per rendere il tuo codice Spark più facile da riutilizzare e testare. Incoraggiano anche buone pratiche di codifica. Questo post dimostrerà i due diversi modi per parametrizzare le query PySpark:

  1. Formattazione di stringhe personalizzata di PySpark custom string formatting
  2. Indicatori di parametro Parameter markers

Vediamo come utilizzare entrambi i tipi di query parametrizzate PySpark ed esploriamo perché la funzionalità integrata è migliore di altre alternative.

Vantaggi delle query parametrizzate

Le query parametrizzate incoraggiano il modello "don't repeat yourself" (DRY), rendono più facili i test unitari e rendono SQL più facile da riutilizzare. Prevengono anche attacchi di SQL injection, che possono rappresentare vulnerabilità di sicurezza.

Può essere allettante copiare e incollare grandi blocchi di SQL quando si scrivono query simili. Le query parametrizzate incoraggiano l'astrazione dei modelli e la scrittura di codice con il modello DRY.

Le query parametrizzate sono anche più facili da testare. Puoi parametrizzare una query in modo che sia facile da eseguire su set di dati di produzione e di test.

D'altra parte, parametrizzare manualmente le query SQL con f-string di Python è una scelta scadente. Considera i seguenti svantaggi:

  1. Le f-string di Python non proteggono dagli attacchi di SQL injection.
  2. Le f-string di Python non comprendono oggetti nativi di Python come DataFrame, colonne e caratteri speciali.

Vediamo come parametrizzare le query con indicatori di parametro, che proteggono il tuo codice dalle vulnerabilità di SQL injection e supportano la conversione automatica dei tipi delle istanze PySpark comuni in formato stringa.

Query parametrizzate con formattazione di stringhe personalizzata di PySpark

Supponiamo che tu abbia la seguente tabella di dati chiamata h20_1e9 con nove colonne:

Vorresti parametrizzare la seguente query SQL:

Vorresti rendere facile eseguire questa query con valori diversi di id1. Ecco come parametrizzare ed eseguire la query con diversi valori di id1.

Ora riesegui la query con un altro argomento:

Il formattatore di stringhe PySpark ti consente anche di eseguire query SQL direttamente su un DataFrame senza definire esplicitamente viste temporanee.

Supponiamo che tu abbia il seguente DataFrame chiamato person_df:

Ecco come interrogare il DataFrame con SQL.

Eseguire query su un DataFrame utilizzando la sintassi SQL senza dover registrare manualmente una vista temporanea è molto comodo!

Vediamo ora come parametrizzare le query con argomenti in indicatori di parametro.

Query parametrizzate con indicatori di parametro

Puoi anche usare un dizionario di argomenti per formulare una query SQL parametrizzata con indicatori di parametro.

Supponiamo che tu abbia la seguente vista denominata some_purchases:

Ecco come creare una query parametrizzata con indicatori di parametro denominati per calcolare l'importo totale speso per un dato articolo.

Calcola l'importo totale speso per i calzini.

Puoi anche parametrizzare le query con indicatori di parametro non denominati; vedi qui per maggiori informazioni.

Apache Spark sanifica gli indicatori di parametro, quindi questo approccio di parametrizzazione ti protegge anche dagli attacchi di SQL injection.

eBook

Introduzione all'ETL

Come PySpark sanifica le query parametrizzate

Ecco una descrizione generale di come Spark sanifica le query parametrizzate denominate:

  • La query SQL arriva con un elenco opzionale di parametri chiave/valore.
  • Apache Spark analizza la query SQL e sostituisce i riferimenti ai parametri con i nodi dell'albero di analisi corrispondenti.
  • Durante l'analisi, una regola Catalyst viene eseguita per sostituire questi riferimenti con i loro valori di parametro forniti dai parametri.
  • Questo approccio protegge dagli attacchi di SQL injection perché supporta solo valori letterali. L'interpolazione di stringhe regolare applica la sostituzione sulla stringa SQL; questa strategia può essere vulnerabile agli attacchi se la stringa contiene sintassi SQL diversa dai valori letterali previsti.

Come accennato in precedenza, ci sono due tipi di query parametrizzate supportate in PySpark:

  • Parametrizzazione lato client utilizzando la sintassi {} basata su PEP 3101 (a cui ci siamo riferiti come formattazione di stringhe personalizzata).
  • Parametrizzazione lato server utilizzando indicatori di parametro denominati o indicatori di parametro non denominati.

La sintassi {} esegue una sostituzione di stringa sulla query SQL sul lato client per facilità d'uso e migliore programmabilità. Tuttavia, non protegge dagli attacchi di SQL injection poiché il testo della query viene sostituito prima di essere inviato al server Spark.

La parametrizzazione utilizza l'argomento args dell'API sql() e passa il testo SQL e i parametri separatamente al server. Il testo SQL viene analizzato con i segnaposto dei parametri, sostituendo i valori dei parametri specificati in args nell'albero delle query analizzato.

Ci sono due varianti di query parametrizzate lato server: indicatori di parametro denominati e indicatori di parametro non denominati. Gli indicatori di parametro denominati utilizzano la sintassi :<nome_parametro> per i segnaposto. Vedi la documentazione per maggiori informazioni su come utilizzare gli indicatori di parametro non denominati.

Query parametrizzate vs. interpolazione di stringhe

Puoi anche utilizzare l'interpolazione di stringhe Python standard per parametrizzare le query, ma non è così comodo.

Ecco come dovremmo parametrizzare la nostra query precedente con f-string di Python:

Questo non è così comodo per i seguenti motivi:

  • Richiede la creazione di una vista temporanea.
  • Dobbiamo rappresentare la data come stringa, non come data Python.
  • Dobbiamo racchiudere la data tra apici singoli nella query per formattare correttamente la stringa SQL.
  • Questo non protegge dagli attacchi di SQL injection.

In sintesi, le funzionalità di parametrizzazione delle query integrate sono più sicure ed efficaci dell'interpolazione di stringhe.

Conclusione

Le query parametrizzate PySpark ti offrono nuove funzionalità per scrivere codice pulito con la familiare sintassi SQL. Sono comode quando vuoi interrogare uno Spark DataFrame con SQL. Ti permettono di usare tipi di dati Python comuni come valori in virgola mobile, stringhe, date e datetime, che vengono automaticamente convertiti in valori SQL in background. In questo modo, puoi sfruttare idiomi Python comuni e scrivere codice elegante.

Inizia subito a sfruttare le query parametrizzate PySpark e godrai immediatamente dei vantaggi di una codebase di qualità superiore.

Questa funzionalità è ufficialmente supportata da DBR 15.2.

(Questo post sul blog è stato tradotto utilizzando strumenti basati sull'intelligenza artificiale) Post originale

Non perdere mai un post di Databricks

Iscriviti al nostro blog e ricevi gli ultimi post direttamente nella tua casella di posta elettronica.