Snowpark Migration Accelerator : Code intégré SQL

Note

Actuellement, SMA prend en charge uniquement la fonction _ pyspark.sql _.

SMA peut transformer le code SQL intégré dans des fichiers Python ou Scala. Il traite le code SQL intégré dans les extensions de fichiers suivantes :

  • Fichiers de code source Python (avec l’extension .py)

  • Fichiers de code source Scala (avec l’extension .scala)

  • Fichiers Jupyter Notebooks (avec l’extension .ipynb)

  • Fichiers source Databricks (avec les extensions .python ou .scala)

  • Fichiers d’archive de notebooks Databricks (avec l’extension .dbc)

Exemples de transformation de code SQL intégré

Cas pris en charge

  • Utilisation de la fonction spark.sql dans Python pour exécuter des requêtes SQL :

# Original in Spark
spark.sql("""MERGE INTO people_target pt
USING people_source ps
ON (pt.person_id1 = ps.person_id2)
WHEN NOT MATCHED BY SOURCE THEN DELETE""")
Copy
# SMA transformation
spark.sql("""MERGE INTO people_target pt
USING (
   SELECT
      pt.person_id1
   FROM
      people_target pt
      LEFT JOIN
         people_source ps
         ON pt.person_id1 = ps.person_id2
   WHERE
      ps.person_id2 IS NULL
) s_src
ON pt.person_id1 = s_src.person_id1
WHEN MATCHED THEN
   DELETE;""")
Copy

Cas non pris en charge

Lorsque SMA rencontre un code qu’il ne peut pas convertir, il génère un message d’erreur, d’avertissement ou d’information (EWI) dans le code de sortie. Pour plus de détails sur ces messages, voir EWI.

Les scénarios suivants ne sont pas pris en charge actuellement :

  • Lorsque vous travaillez avec du code SQL, vous pouvez intégrer des variables de chaîne de la manière suivante :

query = "SELECT COUNT(COUNTRIES) FROM SALES"
dfSales = spark.sql(query)
Copy
query = "SELECT COUNT(COUNTRIES) FROM SALES" 
#EWI: SPRKPY1077 => SQL embedded code cannot be processed. 
dfSales = spark.sql(query)
Copy
  • Combinaison de chaînes pour construire le code SQL à l’aide d’une simple concaténation :

base = "SELECT "
criteria_1 = " COUNT(*) "
criteria_2 = " * "
fromClause = " FROM COUNTRIES"

df1 = spark.sql(bas + criteria_1 + fromClause)
df2 = spark.sql(bas + criteria_2 + fromClause)
Copy
base = "SELECT "
criteria_1 = " COUNT(*) "
criteria_2 = " * "
fromClause = " FROM COUNTRIES"
#EWI: SPRKPY1077 => SQL embedded code cannot be processed.

df1 = spark.sql(bas + criteria_1 + fromClause)
#EWI: SPRKPY1077 => SQL embedded code cannot be processed.
df2 = spark.sql(bas + criteria_2 + fromClause)
Copy
  • Utilisation de l’interpolation de chaînes pour générer dynamiquement des instructions SQL :

# Old Style interpolation
UStbl = "SALES_US"
salesUS = spark.sql("SELECT * FROM %s" % (UStbl))

# Using format function
COLtbl = "COL_SALES WHERE YEAR(saleDate) > 2023"
salesCol = spark.sql("SELECT * FROM {}".format(COLtbl))

# New Style
UKTbl = " UK_SALES_JUN_18" 
salesUk = spark.sql(f"SELECT * FROM {UKTbl}")
Copy
# Old Style interpolation
UStbl = "SALES_US"
#EWI: SPRKPY1077 => SQL embedded code cannot be processed.
salesUS = spark.sql("SELECT * FROM %s" % (UStbl))

# Using format function
COLtbl = "COL_SALES WHERE YEAR(saleDate) > 2023"
#EWI: SPRKPY1077 => SQL embedded code cannot be processed.
salesCol = spark.sql("SELECT * FROM {}".format(COLtbl))

# New Style
UKTbl = " UK_SALES_JUN_18"
#EWI: SPRKPY1077 => SQL embedded code cannot be processed.
salesUk = spark.sql(f"SELECT * FROM {UKTbl}")
Copy
  • Utilisation de fonctions qui génèrent dynamiquement des requêtes SQL :

def ByMonth(month):
    query = f"SELECT * LOGS WHERE MONTH(access_date) = {month}"
    return spark.sql(query)
Copy
def ByMonth(month):
query = f"SELECT * LOGS WHERE MONTH(access_date) = {month}"
    #EWI: SPRKPY1077 => SQL embedded code cannot be processed.
    return spark.sql(query)
Copy

Cas non pris en charge et messages EWI

  • Lors de l’analyse du code Scala, le code d’erreur SPRKSCL1173 indique des instructions SQL intégrées non prises en charge.

/*Scala*/
 class SparkSqlExample {
    def main(spark: SparkSession) : Unit = {
    /*EWI: SPRKSCL1173 => SQL embedded code cannot be processed.*/
    spark.sql("CREATE VIEW IF EXISTS My View AS Select * From my Table WHERE date < current_date() ")
    }
Copy
  • Lorsque le code Python contient des instructions SQL intégrées non prises en charge, le code d’erreur SPRKPY1077 s’affiche.

# Python Output 
#EWI: SPRKPY1077 => SQL embedded code cannot be processed.
b = spark.sql("CREATE VIEW IF EXISTS My View AS Select * From my Table WHERE date < current_date() ")
Copy