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 pode ser convertido, ele gera uma mensagem de erro, aviso ou informação (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