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

지원되지 않는 케이스

SMA 에서 변환할 수 없는 코드가 발견되면 출력 코드에 오류, 경고 또는 정보(EWI) 메시지를 생성합니다. 이러한 메시지에 대한 자세한 내용은 EWI 를 참조하십시오.

다음 시나리오는 현재 지원되지 않습니다.

  • SQL 코드로 작업할 때 다음과 같은 방법으로 문자열 변수를 통합할 수 있습니다.

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
  • 문자열을 결합하여 간단한 연결을 사용하여 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)
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
  • 문자열 보간을 사용하여 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
  • 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

지원되지 않는 케이스 및 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() ")
    }
Copy
  • 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() ")
Copy