Snowpark Migration Accelerator: Código incorporado SQL

Nota

Atualmente, o SMA é compatível apenas com a função _ pyspark.sql.

O SMA pode transformar o código SQL que está incorporado em arquivos Python ou Scala. Ele processa o código SQL incorporado nas seguintes extensões de arquivo:

  • Arquivos de código-fonte Python (com extensão .py)

  • Arquivos de código-fonte Scala (com extensão .scala)

  • Arquivos do Jupyter Notebook (com extensão .ipynb)

  • Arquivos de origem do Databricks (com extensões .python ou .scala)

  • Arquivos de arquivo do Databricks Notebook (com extensão .dbc)

Amostras de transformação de código SQL incorporadas

Caso suportado

  • Usar a função spark.sql em Python para executar consultas 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

Casos sem suporte

Quando o SMA encontra um código que não consegue converter, gera uma mensagem de erro, aviso e problema (EWI) no código de saída. Para obter mais detalhes sobre essas mensagens, consulte EWI.

Os cenários a seguir não são suportados no momento:

  • Ao trabalhar com o código SQL, você pode incorporar variáveis de cadeia de caracteres da seguinte forma:

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
  • Combinação de cadeia de caracteres para criar o código SQL usando concatenação simples:

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
  • Usar a interpolação de cadeia de caracteres para gerar dinamicamente instruções 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
  • Usar funções que geram consultas SQL dinamicamente:

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

Casos sem suporte e mensagens EWI

  • Ao analisar o código Scala, o código de erro SPRKSCL1173 indica instruções SQL incorporadas sem suporte.

/*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
  • Quando o código Python contém instruções SQL incorporadas não suportadas, o código de erro SPRKPY1077 será exibido.

# 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