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¶
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)
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() ")