web-dev-qa-db-fra.com

obtenir les min et max d'une colonne spécifique scala spark dataframe

Je voudrais accéder aux min et max d'une colonne spécifique de mon cadre de données mais je n'ai pas l'en-tête de la colonne, mais son numéro, alors je devrais utiliser scala??

peut-être quelque chose comme ceci:

val q = nextInt(ncol) //we pick a random value for a column number
col = df(q)
val minimum = col.min()

Désolé si cela ressemble à une question idiote mais je n’ai trouvé aucune information sur SO à propos de cette question: /

18
Laure D

Pourquoi ne pas obtenir le nom de la colonne à partir des métadonnées:

val selectedColumnName = df.columns(q) //pull the (q + 1)th column from the columns array
df.agg(min(selectedColumnName), max(selectedColumnName))
23
Justin Pihony

Vous pouvez utiliser la correspondance de modèle tout en assignant une variable:

import org.Apache.spark.sql.functions.{min, max}
import org.Apache.spark.sql.Row

val Row(minValue: Double, maxValue: Double) = df.agg(min(q), max(q)).head

Où q est un Column ou un nom de colonne (String). En supposant que votre type de données est Double.

21
Tautvydas

Vous pouvez utiliser le numéro de colonne pour extraire d’abord les noms de colonne (en indexant df.columns), Puis agrégé pour utiliser les noms de colonne:

val df = Seq((2.0, 2.1), (1.2, 1.4)).toDF("A", "B")
// df: org.Apache.spark.sql.DataFrame = [A: double, B: double]

df.agg(max(df(df.columns(1))), min(df(df.columns(1)))).show
+------+------+

|max(B)|min(B)|
+------+------+
|   2.1|   1.4|
+------+------+
6
Psidom

Voici un moyen direct d'obtenir le min et le max d'un dataframe avec des noms de colonnes:

val df = Seq((1, 2), (3, 4), (5, 6)).toDF("A", "B")

df.show()
/*
+---+---+
|  A|  B|
+---+---+
|  1|  2|
|  3|  4|
|  5|  6|
+---+---+
*/

df.agg(min("A"), max("A")).show()
/*
+------+------+
|min(A)|max(A)|
+------+------+
|     1|     5|
+------+------+
*/

Si vous voulez obtenir les valeurs min et max sous forme de variables séparées, vous pouvez convertir le résultat de agg() ci-dessus en un Row et utiliser Row.getInt(index) pour obtenir la colonne. valeurs de la Row.

val min_max = df.agg(min("A"), max("A")).head()
// min_max: org.Apache.spark.sql.Row = [1,5]

val col_min = min_max.getInt(0)
// col_min: Int = 1

val col_max = min_max.getInt(1)
// col_max: Int = 5
4
stackoverflowuser2010