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.
import org.Apache.spark.sql.functions._
val data="some variable"
df.filter(col("column1") > lit(data))
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
.
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
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();
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|
+-----+
vous pouvez simplement le faire en utilisant interpolation de chaîne
val data="some variable"
df.filter(s"column1 > $data")
import org.Apache.spark.sql.functions._
val portfolio_name = "Product"
spark.sql("""SELECT
*
FROM
Test""").filter($"portfolio_name"===s"$portfolio_name").show(100)