web-dev-qa-db-fra.com

Filtrer Spark Dataframe avec une variable

Est-ce même possible dans spark dataframe (1.6/2.1)

val data="some variable"

df.filter("column1"> data)

Je peux le faire avec une valeur statique mais je ne peux pas comprendre comment filtrer par une variable.

5
Goby Bala
import org.Apache.spark.sql.functions._

val data="some variable"
df.filter(col("column1") > lit(data))
4
pasha701

Je ne suis pas sûr de savoir comment vous y êtes arrivé avec un littéral puisque ce que vous avez ne correspond à aucune des signatures de la méthode filter.

Alors oui, vous pouvez travailler avec un non-littéral, mais essayez ceci:

import sparkSession.implicits._
df.filter($"column1" > data)

Notez le $, qui utilise la conversion implicit pour transformer String en Column portant le nom String. Pendant ce temps, cette Column a une méthode > qui prend une Any et retourne une nouvelle Column. Cette Any sera votre valeur data.

2
Vidya

Oui, vous pouvez utiliser une variable pour filtrer Spark Dataframe. 

val keyword = "my_key_Word"
var keyword = "my_key_Word" // if it is a variable

df.filter($"column1".contains(keyword))
df.filter(lower($"column1").contains(keyword)) //if not case sensitive
1
Abu Shoeb

En Java, on peut faire comme ça:

  int i  =10;

 //for equal condition
  df.select("column1","column2").filter(functions.col("column1").equalTo(i)).show();

 //for greater than or less than
 df.select("no","name").filter(functions.col("no").gt(i)).show();
 df.select("no","name").filter(functions.col("no").lt(i)).show();
1
Satish Karuturi

Voici une démonstration complète du filtre utilisant <>= sur des colonnes numériques où mysearchid est un nombre déclaré comme val ci-dessous ...

scala>val numRows =10
scala>val ds = spark.range(0, numRows)
ds: org.Apache.spark.sql.Dataset[Long] = [id: bigint]

scala>val df = ds.toDF("index")
df: org.Apache.spark.sql.DataFrame = [index: bigint]

scala>df.show
+-----+
|index|
+-----+
|    0|
|    1|
|    2|
|    3|
|    4|
|    5|
|    6|
|    7|
|    8|
|    9|
+-----+


scala>val mysearchid=9
mysearchid: Int = 9

scala>println("filter with less than ")
filter with less than

scala>df.filter(df("index") < mysearchid).show
+-----+
|index|
+-----+
|    0|
|    1|
|    2|
|    3|
|    4|
|    5|
|    6|
|    7|
|    8|
+-----+


scala> println("filter with greater than ")
filter with greater than

scala> df.filter(df("index") > mysearchid).show
+-----+
|index|
+-----+
+-----+


scala> println("filter with equals ")
filter with equals

scala> df.filter(df("index") ===  mysearchid).show
+-----+
|index|
+-----+
|    9|
+-----+
1
Ram Ghadiyaram

vous pouvez simplement le faire en utilisant interpolation de chaîne

val data="some variable"
df.filter(s"column1 > $data")
0
7kemZmani
import org.Apache.spark.sql.functions._

val portfolio_name = "Product"

spark.sql("""SELECT
   *
FROM
    Test""").filter($"portfolio_name"===s"$portfolio_name").show(100)
0
Rajiv Singh