web-dev-qa-db-fra.com

Sélectionner des colonnes spécifiques dans Spark DataFrame

Je suis nouveau à Spark.

J'ai chargé des données CSV dans un Spark DataFrame.

J'ai besoin de découper ce dataframe en deux Dataframe différentes, chacune contenant un ensemble de colonnes de l'original.

Ma question est donc de savoir comment sous-définir un cadre de données Spark, basé sur des colonnes?

3
A.HADDAD

Si vous souhaitez diviser votre cadre de données en deux types différents, effectuez deux sélections dessus avec les différentes colonnes souhaitées.

 val sourceDf = spark.read.csv(...)
 val df1 = sourceDF.select(first set of columns)
 val df2 = sourceDF.select(second set of columns)

Notez que cela signifie bien sûr que le sourceDF serait évalué deux fois. Par conséquent, s’il peut tenir dans la mémoire distribuée et que vous utilisez la plupart des colonnes dans les deux cadres de données, il peut être judicieux de le mettre en cache. Si elle contient de nombreuses colonnes supplémentaires dont vous n’avez pas besoin, vous pouvez d’abord effectuer une sélection sur les colonnes dont vous aurez besoin pour stocker toutes les données supplémentaires en mémoire.

2
puhlen

Disons que notre Dataframe parent a 'n' columns

nous pouvons créer 'x' child DataFrames (considérons 2 dans notre cas). 

Les colonnes du Dataframe enfant peuvent être choisies librement parmi les colonnes Dataframe parent. 

Considérons que la source a 10 colonnes et que nous souhaitons nous séparer en 2 DataFrames qui contient les colonnes référencées à partir du Dataframe parent.

Les colonnes du Dataframe enfant peuvent être définies à l'aide de l'API select Dataframe 

val parentDF = spark.read.format("csv").load("/path of the CSV file")

val Child1_DF = parentDF.select("col1","col2","col3","col9","col10").show()

val child2_DF = parentDF.select("col5", "col6","col7","col8","col1","col2").show()

Notez que le nombre de colonnes dans les images de données enfants peut être de longueur différente et inférieur au nombre de colonnes du fichier de données parent.

nous pouvons également faire référence aux noms de colonne sans mentionner les noms réels à l'aide des index de position de la colonne souhaitée du cadre de données parent 

L'importation spark implique en premier lieu d'agir comme une classe d'assistance pour l'utilisation de la $ -notation afin d'accéder aux colonnes à l'aide des index de position.

import spark.implicits._
import org.Apache.spark.sql.functions._

val child3_DF  = parentDF.select("_c0","_c1","_c2","_c8","_c9").show()

nous pouvons également sélectionner des colonnes en fonction de certaines conditions. Disons que nous voulons que seules les colonnes numérotées soient sélectionnées dans le cadre de données enfant. Même nous nous référons à des colonnes même indexées et à un index commençant à '0' 

val parentColumns = parentDF.columns.toList


res0: List[String] = List(_c0, _c1, _c2, _c3, _c4, _c5, _c6, _c7,_c8,_c9)

val evenParentColumns =  res0.zipWithIndex.filter(_._2 % 2 == 0).map( _._1).toSeq

res1: scala.collection.immutable.Seq[String] = List(_c0, _c2, _c4, _c6,_c8)

Alimentez maintenant ces colonnes pour qu'elles soient sélectionnées à partir du parentDF.Notez que l'API de sélection a besoin d'arguments de type seq.

val child4_DF = parentDF.select(res1.head, res1.tail:_*).show()

Cela montrera les colonnes même indexées du Dataframe parent.


| _c0 | _c2 | _c4 | _c6 | _c8 |


| ITE00100554 | TMAX | null | E | 1 |

| TE00100554 | TMIN | null | E | 4 |

| GM000010962 | PRCP | null | E | 7 |

Alors maintenant, il nous reste les colonnes paires numérotées dans le cadre de données 

De même, nous pouvons également appliquer d'autres opérations à la colonne Dataframe, comme illustré ci-dessous.

val child5_DF = parentDF.select($"_c0", $"_c8" + 1).show()

Donc, de plusieurs manières, comme mentionné, nous pouvons sélectionner les colonnes dans le Dataframe. 

2
prasanna kumar

Résolu, Utilisez simplement select pour le dataframe afin de sélectionner les colonnes:

 val df=spark.read.csv("C:\\Users\\Ahmed\\Desktop\\cabs_trajectories\\cabs_trajectories\\green\\2014\\green_tripdata_2014-09.csv")

val df1=df.select("_c0")

cela serait un sous-ensemble de la première colonne du cadre de données

0
A.HADDAD

Simplement en utilisant select select, vous pouvez sélectionner des colonnes particulières, leur attribuer des noms lisibles et les convertir. Par exemple, comme ceci: 

spark.read.csv(path).select(
          '_c0.alias("stn").cast(StringType),
          '_c1.alias("wban").cast(StringType),
          '_c2.alias("lat").cast(DoubleType),
          '_c3.alias("lon").cast(DoubleType)
        )
          .where('_c2.isNotNull && '_c3.isNotNull && '_c2 =!= 0.0 && '_c3 =!= 0.0)
0
dehasi