Snowpark Migration Accelerator: SQL 임베디드 코드¶
참고
현재 SMA 는 _ pyspark.sql _ 함수만 지원합니다.
SMA 는 Python 또는 Scala 파일에 포함된 SQL 코드를 변환할 수 있습니다. 임베드된 SQL 코드를 다음 파일 확장자로 처리합니다.
Python 소스 코드 파일(.py 확장자 포함)
Scala 소스 코드 파일(.scala 확장자)
Jupyter Notebook 파일(.ipynb 확장자)
Databricks 소스 파일(.Python 또는 .Scala 확장자)
Databricks Notebook 아카이브 파일(.dbc 확장자)
임베디드 SQL 코드 변환 샘플¶
지원되는 케이스¶
Python에서 spark.sql 함수를 사용하여 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""")
# 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;""")
지원되지 않는 케이스¶
SMA 에서 변환할 수 없는 코드가 발견되면 출력 코드에 오류, 경고 또는 정보(EWI) 메시지를 생성합니다. 이러한 메시지에 대한 자세한 내용은 EWI 를 참조하십시오.
다음 시나리오는 현재 지원되지 않습니다.
SQL 코드로 작업할 때 다음과 같은 방법으로 문자열 변수를 통합할 수 있습니다.
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)
문자열을 결합하여 간단한 연결을 사용하여 SQL 코드를 작성합니다.
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)
문자열 보간을 사용하여 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}")
# 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}")
SQL 쿼리를 동적으로 생성하는 함수 사용:
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)
지원되지 않는 케이스 및 EWI 메시지¶
Scala 코드를 분석할 때 오류 코드 SPRKSCL1173 은 지원되지 않는 임베디드 SQL 문을 나타냅니다.
/*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() ")
}
Python 코드에 지원되지 않는 임베디드 SQL 문이 포함된 경우 오류 코드 SPRKPY1077 이 표시됩니다.
# 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() ")