2017-10-16 3 views
1

J'ai un fichier CSV dans lequel certains en-têtes de colonne et leurs valeurs correspondantes sont null. Je voudrais savoir comment puis-je déposer des colonnes qui ont le nom null? Sample CSV est la suivante:Comment faire pour supprimer plusieurs colonnes de Spark Data Frame?

"name"|"age"|"city"|"null"|"null"|"null" 
"abcd"|"21" |"7yhj"|"null"|"null"|"null" 
"qazx"|"31" |"iuhy"|"null"|"null"|"null" 
"foob"|"51" |"barx"|"null"|"null"|"null" 

Je veux laisser tomber toutes les colonnes qui a en-tête a null telle que la trame de données de sortie ressemblera ci-dessous:

"name"|"age"|"city" 
"abcd"|"21" |"7yhj" 
"qazx"|"31" |"iuhy" 
"foob"|"51" |"barx" 

Quand je charge cette CSV étincelle , Spark ajoute nombre de colonnes nULL comme indiqué ci-dessous:

"name"|"age"|"city"|"null4"|"null5"|"null6" 
"abcd"|"21" |"7yhj"|"null"|"null"|"null" 
"qazx"|"31" |"iuhy"|"null"|"null"|"null" 
"foob"|"51" |"barx"|"null"|"null"|"null" 

Solution trouvée

Merci @MaxU pour la réponse. Ma solution finale est:

val filePath = "C:\\Users\\shekhar\\spark-trials\\null_column_header_test.csv" 

val df = spark.read.format("csv") 
.option("inferSchema", "false") 
.option("header", "true") 
.option("delimiter", "|") 
.load(filePath) 

val q = df.columns.filterNot(c => c.startsWith("null")).map(a => df(a)) 
// df.columns.filterNot(c => c.startsWith("null")) this part removes column names which start with null and returns array of string. each element of array represents column name 

// .map(a => df(a)) converts elements of array into object of type Column 
df.select(q:_*).show 

Répondre

3

IIUC vous pouvez le faire de cette façon:

df = df.drop(df.columns.filter(_.startsWith("null"))) 
+1

vous avez oublié de fermer si vous manquez un support. – BlueTomato

+0

@BlueTomato, bonne prise - merci! C'est réparé maintenant – MaxU