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:
Vediamo come utilizzare entrambi i tipi di query parametrizzate PySpark ed esploriamo perché la funzionalità integrata è migliore di altre alternative.
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:
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.
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.
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.
Ecco una descrizione generale di come Spark sanifica le query parametrizzate denominate:
Come accennato in precedenza, ci sono due tipi di query parametrizzate supportate in PySpark:
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.
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:
In sintesi, le funzionalità di parametrizzazione delle query integrate sono più sicure ed efficaci dell'interpolazione di stringhe.
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
