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;
DataFrame df = session.table("sample_product_data");
DataFrame dfSelectedCols = df.select(Functions.col("id"), Functions.col("name"));
dfSelectedCols.show();

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;
DataFrame df = session.table("sample_product_data");
DataFrame dfRenamedCol = df.select(Functions.col("id").as("item_id"));
dfRenamedCol.show();
DataFrame df = session.table("sample_product_data");
DataFrame dfRenamedCol = df.select(Functions.col("id").alias("item_id"));
dfRenamedCol.show();

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;
DataFrame df = session.table("sample_product_data");
DataFrame dfFilteredRows = df.filter(Functions.col("id").equal_to(Functions.lit(1)));
dfFilteredRows.show();
DataFrame df = session.table("sample_product_data");
DataFrame dfFilteredRows = df.where(Functions.col("id").equal_to(Functions.lit(1)));
dfFilteredRows.show();

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;
DataFrame df = session.table("sample_product_data");
DataFrame dfSorted = df.sort(Functions.col("category_id"));
dfSorted.show();

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;
DataFrame df = session.table("sample_product_data");
DataFrame dfSorted = df.sort(Functions.col("category_id")).limit(2);
Row[] arrayRows = dfSorted.collect();

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;
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();
SELECT * FROM sample_a NATURAL JOIN sample_b;
DataFrame dfLhs = session.table("sample_a");
DataFrame dfRhs = session.table("sample_b");
DataFrame dfJoined = dfLhs.naturalJoin(dfRhs);
dfJoined.show();

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;
DataFrame df = session.table("car_sales");
DataFrame dfJsonField =
  df.select(Functions.col("src").subField("salesperson").subField("name"));
dfJsonField.show();

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;
DataFrame df = session.table("sample_product_data");
DataFrame dfCountPerCategory = df.groupBy(Functions.col("category_id")).count();
dfCountPerCategory.show();

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;
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();

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;
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());
DELETE FROM sample_product_data
  WHERE category_id = 50;
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());
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;
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();

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;
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());
}
GET @myStage file:///tmp PATTERN = '.*.csv.gz';
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());
}

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;
DataFrame df = session.read().json(
  "@mystage/car_sales.json").select(
    Functions.col("$1").subField(0).subField("salesperson").subField("name"));
df.show();

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);
CopyableDataFrame dfCopyableDf = session.read().json("@mystage/car_sales.json");
dfCopyableDf.copyInto("new_car_sales");

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

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;
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();
CREATE FUNCTION <temp_function_name>
  RETURNS INT
  LANGUAGE JAVA
  ...
  AS
  ...;

SELECT ...,
  <temp_function_name>(quantity) AS doublenum
  FROM sample_product_data;
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();
CREATE FUNCTION doubleUdf(arg1 INT)
  RETURNS INT
  LANGUAGE JAVA
  ...
  AS
  ...;

SELECT ...,
  doubleUdf(quantity) AS doublenum
  FROM sample_product_data;
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();