Référence rapide : APIs Snowpark Java pour commandes SQL

Cette rubrique fournit une référence rapide de certaines des APIs Snowpark qui correspondent aux commandes SQL.

(Notez que ce n’est pas une liste complète des APIs qui correspondent aux commandes SQL).

Dans ce chapitre :

Exécution des requêtes

Sélection de colonnes

Pour sélectionner des colonnes spécifiques, utilisez select.

Exemple d’une instruction SQL

Exemple de code 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

Renommage de colonnes

Pour renommer une colonne, utilisez as ou alias.

Exemple d’une instruction SQL

Exemple de code 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

Filtrage des données

Pour filtrer les données, utilisez filter ou where.

Exemple d’une instruction SQL

Exemple de code 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

Tri des données

Pour trier les données, utilisez sort.

Exemple d’une instruction SQL

Exemple de code 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

Limitation du nombre de lignes retournées

Pour limiter le nombre de lignes retournées, utilisez limit. Voir Limitation du nombre de lignes dans un DataFrame.

Exemple d’une instruction SQL

Exemple de code 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

Exécution de jointures

Pour effectuer une jointure, utilisez join ou naturalJoin. Voir Joindre des DataFrames.

Exemple d’une instruction SQL

Exemple de code 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

Interrogation de données semi-structurées

Pour parcourir des données semi-structurées, utilisez subField(« <field_name> ») et subField(<index>). Voir Utilisation de données semi-structurées.

Exemple d’une instruction SQL

Exemple de code 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

Regroupement et agrégation de données

Pour regrouper des données, utilisez groupBy. Cela renvoie un objet RelationalGroupedDataFrame, que vous pouvez utiliser pour effectuer les agrégations.

Exemple d’une instruction SQL

Exemple de code 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

Appel des fonctions de fenêtre

Pour appeler une fonction de fenêtre, utilisez les méthodes de l’objet Window pour créer un objet WindowSpec, que vous pourrez utiliser à votre tour pour les fonctions de fenêtre (de la même manière que pour “<function> OVER … PARTITION BY … ORDER BY”).

Exemple d’une instruction SQL

Exemple de code 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

Mise à jour, suppression et fusion des lignes

Pour mettre à jour, supprimer et fusionner les lignes d’une table, utilisez Updatable. Voir Mise à jour, suppression et fusion des lignes d’une table.

Exemple d’une instruction SQL

Exemple de code 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

Utilisation des zones de préparation

Pour plus d’informations sur l’utilisation de zones de préparation, voir Travailler avec des fichiers dans une zone de préparation.

Chargement et téléchargement de fichiers à partir d’une zone de préparation

Pour charger et télécharger des fichiers à partir d’une zone de préparation, utilisez FileOperation. Voir Chargement et téléchargement de fichiers dans une zone de préparation.

Exemple d’une instruction SQL

Exemple de code 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

Lecture des données de fichiers dans une zone de préparation

Pour lire les données de fichiers dans une zone de préparation, utilisez DataFrameReader pour créer un DataFrame pour les données. Voir Configuration d’un DataFrame pour des fichiers dans une zone de préparation.

Exemple d’une instruction SQL

Exemple de code 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

Copie des données de fichiers dans une zone de préparation vers une table

Pour copier des données de fichiers dans une zone de préparation vers une table, utilisez DataFrameReader pour créer un CopyableDataFrame pour les données, et utilisez la méthode copyInto pour copier les données dans la table. Voir Copier les données d’un fichier dans une table.

Exemple d’une instruction SQL

Exemple de code 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

Sauvegarde d’un DataFrame dans des fichiers sur une zone de préparation

Pour enregistrer un DataFrame dans des fichiers sur une zone de préparation, utilisez la méthode DataFrameWriter dont le nom correspond au format des fichiers que vous souhaitez utiliser. Voir Sauvegarde d’un DataFrame dans des fichiers sur une zone de préparation.

Exemple d’une instruction SQL

Exemple de code 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

Création et appel de fonctions définies par l’utilisateur (UDFs)

Pour créer une UDF anonyme, utilisez Functions.udf.

Pour créer une UDF temporaire ou permanente que vous pouvez appeler par son nom, utilisez UDFRegistration.registerTemporary ou UDFRegistration.registerPermanent.

Pour appeler une UDF permanente par son nom, utilisez Functions.callUDF.

Pour plus de détails, voir Création de fonctions définies par l’utilisateur (UDFs) pour DataFrames dans Java et Appel de fonctions scalaires définies par l’utilisateur (UDFs).

Exemple d’une instruction SQL

Exemple de code 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

Création et appel de procédures stockées

Pour un guide sur la création de procédures stockées avec Snowpark, consultez Création de procédures stockées pour DataFrames dans Java.

Exemple d’une instruction SQL

Exemple de code 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