Referência rápida: APIs do Snowpark Java para comandos SQL

Este tópico fornece uma referência rápida de algumas das APIs do Snowpark que correspondem a comandos SQL.

(Note que esta não é uma lista completa das APIs que correspondem a comandos SQL).

Neste tópico:

Como realizar consultas

Como selecionar colunas

Para selecionar colunas específicas, use select.

Exemplo de uma instrução SQL

Exemplo de código do Snowpark

SELECT id, name FROM sample_product_data;
Copy
DataFrame df = session.table("sample_product_data");

DataFrame dfSelectedCols = df.select(Functions.col("id"), Functions.col("name"));

dfSelectedCols.show();
Copy

Como renomear colunas

Para renomear uma coluna, use as ou alias.

Exemplo de uma instrução SQL

Exemplo de código do Snowpark

SELECT id AS item_id FROM sample_product_data;
Copy
DataFrame df = session.table("sample_product_data");

DataFrame dfRenamedCol = df.select(Functions.col("id").as("item_id"));

dfRenamedCol.show();
Copy
DataFrame df = session.table("sample_product_data");

DataFrame dfRenamedCol = df.select(Functions.col("id").alias("item_id"));

dfRenamedCol.show();
Copy

Como filtrar dados

Para filtrar dados, use filter ou where.

Exemplo de uma instrução SQL

Exemplo de código do Snowpark

SELECT * FROM sample_product_data WHERE id = 1;
Copy
DataFrame df = session.table("sample_product_data");

DataFrame dfFilteredRows = df.filter(Functions.col("id").equal_to(Functions.lit(1)));

dfFilteredRows.show();
Copy
DataFrame df = session.table("sample_product_data");

DataFrame dfFilteredRows = df.where(Functions.col("id").equal_to(Functions.lit(1)));

dfFilteredRows.show();
Copy

Como ordenar os dados

Para ordenar os dados, use sort.

Exemplo de uma instrução SQL

Exemplo de código do Snowpark

SELECT * FROM sample_product_data ORDER BY category_id;
Copy
DataFrame df = session.table("sample_product_data");

DataFrame dfSorted = df.sort(Functions.col("category_id"));

dfSorted.show();
Copy

Como limitar o número de linhas retornadas

Para limitar o número de linhas retornadas, use limit. Consulte Como limitar o número de linhas em um DataFrame.

Exemplo de uma instrução SQL

Exemplo de código do Snowpark

SELECT * FROM sample_product_data
  ORDER BY category_id LIMIT 2;
Copy
DataFrame df = session.table("sample_product_data");

DataFrame dfSorted = df.sort(Functions.col("category_id")).limit(2);

Row[] arrayRows = dfSorted.collect();
Copy

Como realizar junções

Para realizar uma junção, use join ou naturalJoin. Consulte Junção de DataFrames.

Exemplo de uma instrução SQL

Exemplo de código do Snowpark

SELECT * FROM sample_a
  INNER JOIN sample_b
  on sample_a.id_a = sample_b.id_a;
Copy
DataFrame dfLhs = session.table("sample_a");

DataFrame dfRhs = session.table("sample_b");

DataFrame dfJoined =
  dfLhs.join(dfRhs, dfLhs.col("id_a").equal_to(dfRhs.col("id_a")));

dfJoined.show();
Copy
SELECT * FROM sample_a NATURAL JOIN sample_b;
Copy
DataFrame dfLhs = session.table("sample_a");

DataFrame dfRhs = session.table("sample_b");

DataFrame dfJoined = dfLhs.naturalJoin(dfRhs);

dfJoined.show();
Copy

Consulta de dados semiestruturados

Para percorrer dados semiestruturados, use subField(«<field_name>») e subField(<index>). Consulte Como trabalhar com dados semiestruturados.

Exemplo de uma instrução SQL

Exemplo de código do Snowpark

SELECT src:salesperson.name FROM car_sales;
Copy
DataFrame df = session.table("car_sales");

DataFrame dfJsonField =
  df.select(Functions.col("src").subField("salesperson").subField("name"));

dfJsonField.show();
Copy

Agrupamento e agregação de dados

Para agrupar dados, use groupBy. Isso retorna um objeto RelationalGroupedDataFrame que você pode usar para realizar as agregações.

Exemplo de uma instrução SQL

Exemplo de código do Snowpark

SELECT category_id, count(*)
  FROM sample_product_data GROUP BY category_id;
Copy
DataFrame df = session.table("sample_product_data");

DataFrame dfCountPerCategory = df.groupBy(Functions.col("category_id")).count();

dfCountPerCategory.show();
Copy

Como chamar funções de janela

Para chamar uma função de janela, use os métodos do objeto Window para construir um objeto WindowSpec, que por sua vez você pode usar para funções de janela (semelhante ao uso de “<function> OVER … PARTITION BY … ORDER BY”).

Exemplo de uma instrução SQL

Exemplo de código do Snowpark

SELECT category_id, id, SUM(amount) OVER
  (PARTITION BY category_id ORDER BY product_date)
  FROM sample_product_data ORDER BY product_date;
Copy
WindowSpec window = Window.partitionBy(
  Functions.col("category_id")).orderBy(Functions.col("product_date"));

DataFrame df = session.table("sample_product_data");

DataFrame dfCumulativePrices = df.select(
  Functions.col("category_id"), Functions.col("product_date"),
  Functions.sum(Functions.col("amount")).over(window)).sort(Functions.col("product_date"));

dfCumulativePrices.show();
Copy

Atualização, exclusão e fusão de linhas

Para atualizar, excluir e fundir linhas em uma tabela, use Updatable. Consulte Atualização, eliminação e fusão de linhas em uma tabela.

Exemplo de uma instrução SQL

Exemplo de código do Snowpark

UPDATE sample_product_data
  SET serial_number = 'xyz' WHERE id = 12;
Copy
import java.util.HashMap;
import java.util.Map;
...

Map<Column, Column> assignments = new HashMap<>();

assignments.put(Functions.col("serial_number"), Functions.lit("xyz"));

Updatable updatableDf = session.table("sample_product_data");

UpdateResult updateResult =
  updatableDf.update(
    assignments,
    Functions.col("id").equal_to(Functions.lit(12)));

System.out.println("Number of rows updated: " + updateResult.getRowsUpdated());
Copy
DELETE FROM sample_product_data
  WHERE category_id = 50;
Copy
Updatable updatableDf = session.table("sample_product_data");

DeleteResult deleteResult =
  updatableDf.delete(updatableDf.col("category_id").equal_to(Functions.lit(50)));

System.out.println("Number of rows deleted: " + deleteResult.getRowsDeleted());
Copy
MERGE  INTO target_table USING source_table
  ON target_table.id = source_table.id
  WHEN MATCHED THEN
    UPDATE SET target_table.description =
      source_table.description;
Copy
import java.util.HashMap;
import java.util.Map;

Map<String, Column> assignments = new HashMap<>();
assignments.put("description", source.col("description"));
MergeResult mergeResult =
   target.merge(source, target.col("id").equal_to(source.col("id")))
  .whenMatched.updateColumn(assignments)
  .collect();
Copy

Como trabalhar com estágios

Para obter mais informações sobre como trabalhar com estágios, consulte Como trabalhar com arquivos em um estágio.

Como carregar e baixar arquivos de um estágio

Para carregar e baixar arquivos de um estágio, use FileOperation. Consulte Carregamento e descarregamento de arquivos em um estágio.

Exemplo de uma instrução SQL

Exemplo de código do Snowpark

PUT file:///tmp/*.csv @myStage OVERWRITE = TRUE;
Copy
import java.util.HashMap;
import java.util.Map;
...
Map<String, String> putOptions = new HashMap<>();

putOptions.put("OVERWRITE", "TRUE");

PutResult[] putResults = session.file().put(
  "file:///tmp/*.csv", "@myStage", putOptions);

for (PutResult result : putResults) {
  System.out.println(result.getSourceFileName() + ": " + result.getStatus());
}
Copy
GET @myStage file:///tmp PATTERN = '.*.csv.gz';
Copy
import java.util.HashMap;
import java.util.Map;
...
Map<String, String> getOptions = new HashMap<>();

getOptions.put("PATTERN", "'.*.csv.gz'");

GetResult[] getResults = session.file().get(
 "@myStage", "file:///tmp", getOptions);

for (GetResult result : getResults) {
  System.out.println(result.getFileName() + ": " + result.getStatus());
}
Copy

Como ler dados de arquivos em um estágio

Para ler dados de arquivos em um estágio, use o DataFrameReader para criar um DataFrame para os dados. Consulte Como configurar um DataFrame para arquivos em um estágio.

Exemplo de uma instrução SQL

Exemplo de código do Snowpark

CREATE FILE FORMAT snowpark_temp_format TYPE = JSON;

SELECT "$1"[0]['salesperson']['name'] FROM (
  SELECT $1::VARIANT AS "$1" FROM @mystage/car_sales.json(
    FILE_FORMAT => 'snowpark_temp_format')) LIMIT 10;

DROP FILE FORMAT snowpark_temp_format;
Copy
DataFrame df = session.read().json(
  "@mystage/car_sales.json").select(
    Functions.col("$1").subField(0).subField("salesperson").subField("name"));

df.show();
Copy

Como copiar dados de arquivos em um estágio para uma tabela

Para copiar dados de arquivos em uma estágio para uma tabela, use DataFrameReader para criar um CopyableDataFrame para os dados e use o método copyInto para copiar os dados para a tabela. Consulte Como copiar dados de arquivos para uma tabela.

Exemplo de uma instrução SQL

Exemplo de código do Snowpark

COPY INTO new_car_sales
  FROM @mystage/car_sales.json
  FILE_FORMAT = (TYPE = JSON);
Copy
CopyableDataFrame dfCopyableDf = session.read().json("@mystage/car_sales.json");
dfCopyableDf.copyInto("new_car_sales");
Copy

Como salvar um DataFrame para arquivos em um estágio

Para salvar um DataFrame em arquivos em um estágio, use o método DataFrameWriter nomeado com o formato dos arquivos que você deseja usar. Consulte Como salvar um DataFrame para arquivos em um estágio.

Exemplo de uma instrução SQL

Exemplo de código do Snowpark

COPY INTO @mystage/saved_data.json
  FROM (  SELECT  *  FROM (car_sales) )
  FILE_FORMAT = ( TYPE = JSON COMPRESSION = 'none' )
  OVERWRITE = TRUE
  DETAILED_OUTPUT = TRUE
Copy
DataFrame df = session.table("car_sales");

WriteFileResult writeFileResult = df.write().mode(
  SaveMode.Overwrite).option(
  "DETAILED_OUTPUT", "TRUE").option(
  "compression", "none").json(
  "@mystage/saved_data.json");
Copy

Como criar e chamar funções definidas pelo usuário (UDFs)

Para criar uma UDF anônima, use Functions.udf.

Para criar uma UDF temporária ou permanente que você pode chamar pelo nome, use UDFRegistration.registerTemporary ou UDFRegistration.registerPermanent.

Para chamar uma UDF permanente pelo nome, use Functions.callUDF.

Para obter mais detalhes, consulte Criação de funções definidas pelo usuário (UDFs) para DataFrames em Java e Como chamar funções definidas pelo usuário escalares (UDFs).

Exemplo de uma instrução SQL

Exemplo de código do Snowpark

CREATE FUNCTION <temp_function_name>
  RETURNS INT
  LANGUAGE JAVA
  ...
  AS
  ...;

SELECT ...,
  <temp_function_name>(quantity) AS doublenum
  FROM sample_product_data;
Copy
UserDefinedFunction doubleUdf =
  Functions.udf(
    (Integer x) -> x + x,
    DataTypes.IntegerType,
    DataTypes.IntegerType);

DataFrame df = session.table("sample_product_data");

DataFrame dfWithDoubleNum =
  df.withColumn("doubleNum",
    doubleUdf.apply(Functions.col("quantity")));

dfWithDoubleNum.show();
Copy
CREATE FUNCTION <temp_function_name>
  RETURNS INT
  LANGUAGE JAVA
  ...
  AS
  ...;

SELECT ...,
  <temp_function_name>(quantity) AS doublenum
  FROM sample_product_data;
Copy
UserDefinedFunction doubleUdf =
  session
    .udf()
    .registerTemporary(
      "doubleUdf",
      (Integer x) -> x + x,
      DataTypes.IntegerType,
      DataTypes.IntegerType);

DataFrame df = session.table("sample_product_data");

DataFrame dfWithDoubleNum =
  df.withColumn("doubleNum",
    Functions.callUDF("doubleUdf", Functions.col("quantity")));
dfWithDoubleNum.show();
Copy
CREATE FUNCTION doubleUdf(arg1 INT)
  RETURNS INT
  LANGUAGE JAVA
  ...
  AS
  ...;

SELECT ...,
  doubleUdf(quantity) AS doublenum
  FROM sample_product_data;
Copy
UserDefinedFunction doubleUdf =
  session
    .udf()
    .registerPermanent(
      "doubleUdf",
      (Integer x) -> x + x,
      DataTypes.IntegerType,
      DataTypes.IntegerType,
      "mystage");

DataFrame df = session.table("sample_product_data");

DataFrame dfWithDoubleNum =
  df.withColumn("doubleNum",
    Functions.callUDF("doubleUdf", Functions.col("quantity")));
dfWithDoubleNum.show();
Copy

Como criar e chamar procedimentos armazenados

Para obter um guia sobre como criar procedimentos armazenados com o Snowpark, consulte Criação de procedimentos armazenados para DataFrames em Java.

Exemplo de uma instrução SQL

Exemplo de código do Snowpark

CREATE PROCEDURE <temp_procedure_name>(x INTEGER, y INTEGER)
  RETURNS INTEGER
  LANGUAGE JAVA
  ...
  AS
  $$
  BEGIN
   RETURN x + y;
  END
  $$
  ;

CALL <temp_procedure_name>(2, 3);
Copy
StoredProcedure sp =
  session.sproc().registerTemporary((Session session, Integer x, Integer y) -> x + y,
    new DataType[] {DataTypes.IntegerType, DataTypes.IntegerType},
    DataTypes.IntegerType);

  session.storedProcedure(sp, 2, 3).show();
Copy
CREATE PROCEDURE sproc(x INTEGER, y INTEGER)
  RETURNS INTEGER
  LANGUAGE JAVA
  ...
  AS
  $$
  BEGIN
   RETURN x + y;
  END
  $$
  ;

CALL sproc(2, 3);
Copy
String name = "sproc";

StoredProcedure sp =
  session.sproc().registerTemporary(name,
    (Session session, Integer x, Integer y) -> x + y,
    new DataType[] {DataTypes.IntegerType, DataTypes.IntegerType},
    DataTypes.IntegerType);

  session.storedProcedure(name, 2, 3).show();
Copy
CREATE PROCEDURE add_hundred(x INTEGER)
  RETURNS INTEGER
  LANGUAGE JAVA
  ...
  AS
  $$
  BEGIN
   RETURN x + 100;
  END
  $$
  ;

CALL add_hundred(3);
Copy
String name = "add_hundred";
String stageName = "sproc_libs";

StoredProcedure sp =
  session.sproc().registerPermanent(
    name,
    (Session session, Integer x) -> x + 100,
    DataTypes.IntegerType,
    DataTypes.IntegerType,
    stageName,
    true);

  session.storedProcedure(name, 3).show();
Copy