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""")
# 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;""")
Nicht-unterstützte Fälle¶
Wenn SMA auf Code stößt, den es nicht konvertieren kann, erzeugt es eine Fehler-, Warn- oder Informationsmeldung (EWI) im Ausgabecode. Weitere Einzelheiten zu diesen Meldungen finden Sie unter 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)
query = "SELECT COUNT(COUNTRIES) FROM SALES"
#EWI: SPRKPY1077 => SQL embedded code cannot be processed.
dfSales = spark.sql(query)
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)
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)
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}")
# 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}")
Verwendung von Funktionen, die SQL-Abfragen dynamisch erzeugen:
def ByMonth(month):
query = f"SELECT * LOGS WHERE MONTH(access_date) = {month}"
return spark.sql(query)
def ByMonth(month):
query = f"SELECT * LOGS WHERE MONTH(access_date) = {month}"
#EWI: SPRKPY1077 => SQL embedded code cannot be processed.
return spark.sql(query)
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() ")
}
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() ")