Snowpark Migration Accelerator: SQL Eingebetteter Code

Bemerkung

Derzeit unterstützt SMA nur die Funktion _ pyspark.sql _.

SMA kann SQL-Code umwandeln, der in Python- oder Scala-Dateien eingebettet ist. Es verarbeitet eingebetteten SQL-Code in den folgenden Dateierweiterungen:

  • Python-Quellcode-Dateien (mit Erweiterung .py)

  • Scala-Quellcode-Dateien (mit Erweiterung .scala)

  • Jupyter-Notebook-Dateien (mit Erweiterung .ipynb)

  • Databricks-Quelldateien (mit Erweiterungen .python oder .scala)

  • Databricks-Notebook-Archivdateien (mit Erweiterung .dbc)

Eingebettete SQL-Code-Transformationsbeispiele

Unterstützter Fall

  • Verwenden Sie die Funktion spark.sql in Python, um SQL-Abfragen auszuführen:

# 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

Nicht-unterstützte Fälle

When SMA encounters code that it cannot convert, it generates an Error, Warning, and Issue (EWI) message in the output code. For more details about these messages, see EWI.

Die folgenden Szenarien werden derzeit nicht unterstützt:

  • Wenn Sie mit SQL arbeiten, können Sie Zeichenfolge-Variablen auf folgende Weise einbinden:

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
  • Kombinieren von Zeichenfolgen zum Erstellen von SQL-Code durch einfache Verkettung:

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
  • Verwendung der Zeichenfolge-Interpolation zur dynamischen Erstellung von SQL-Anweisungen:

# 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
  • Verwendung von Funktionen, die SQL-Abfragen dynamisch erzeugen:

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

Nicht unterstützte Fällen und EWI-Meldungen

  • Bei der Analyse von Scala-Code zeigt der SPRKSCL1173-Fehlercode nicht-unterstützte eingebettete SQL-Anweisungen an.

/*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
  • Wenn Python-Code nicht-unterstützte eingebettete SQL-Anweisungen enthält, wird der SPRKPY1077-Fehlercode angezeigt.

# 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