2016-03-14 1 views
9

Tentativo di eliminare una colonna in un DataFrame, ma ho nomi di colonna con punti in essi, che sono sfuggito.Spark 1.6: colonna di trascinamento in DataFrame con nomi di colonne con caratteri escape

Prima di fuggire, il mio schema è simile al seguente:

root 
|-- user_id: long (nullable = true) 
|-- hourOfWeek: string (nullable = true) 
|-- observed: string (nullable = true) 
|-- raw.hourOfDay: long (nullable = true) 
|-- raw.minOfDay: long (nullable = true) 
|-- raw.dayOfWeek: long (nullable = true) 
|-- raw.sensor2: long (nullable = true) 

Se provo ad eliminare una colonna, ottengo:

df = df.drop("hourOfWeek") 
org.apache.spark.sql.AnalysisException: cannot resolve 'raw.hourOfDay' given input columns raw.dayOfWeek, raw.sensor2, observed, raw.hourOfDay, hourOfWeek, raw.minOfDay, user_id; 
     at org.apache.spark.sql.catalyst.analysis.package$AnalysisErrorAt.failAnalysis(package.scala:42) 
     at org.apache.spark.sql.catalyst.analysis.CheckAnalysis$$anonfun$checkAnalysis$1$$anonfun$apply$2.applyOrElse(CheckAnalysis.scala:60) 
     at org.apache.spark.sql.catalyst.analysis.CheckAnalysis$$anonfun$checkAnalysis$1$$anonfun$apply$2.applyOrElse(CheckAnalysis.scala:57) 
     at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$transformUp$1.apply(TreeNode.scala:319) 
     at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$transformUp$1.apply(TreeNode.scala:319) 
     at org.apache.spark.sql.catalyst.trees.CurrentOrigin$.withOrigin(TreeNode.scala:53) 

Si noti che non sto nemmeno cercando di cadere sul le colonne con punti nel nome. Dal momento che non riuscivo a fare molto senza sfuggire i nomi di colonna, ho convertito lo schema per:

root 
|-- user_id: long (nullable = true) 
|-- hourOfWeek: string (nullable = true) 
|-- observed: string (nullable = true) 
|-- `raw.hourOfDay`: long (nullable = true) 
|-- `raw.minOfDay`: long (nullable = true) 
|-- `raw.dayOfWeek`: long (nullable = true) 
|-- `raw.sensor2`: long (nullable = true) 

ma che non sembra aiutare. Ho ancora lo stesso errore.

Ho tentato di sfuggire a tutti i nomi di colonna e di eliminare utilizzando il nome di escape, ma non funziona neanche.

root 
|-- `user_id`: long (nullable = true) 
|-- `hourOfWeek`: string (nullable = true) 
|-- `observed`: string (nullable = true) 
|-- `raw.hourOfDay`: long (nullable = true) 
|-- `raw.minOfDay`: long (nullable = true) 
|-- `raw.dayOfWeek`: long (nullable = true) 
|-- `raw.sensor2`: long (nullable = true) 

df.drop("`hourOfWeek`") 
org.apache.spark.sql.AnalysisException: cannot resolve 'user_id' given input columns `user_id`, `raw.dayOfWeek`, `observed`, `raw.minOfDay`, `raw.hourOfDay`, `raw.sensor2`, `hourOfWeek`; 
     at org.apache.spark.sql.catalyst.analysis.package$AnalysisErrorAt.failAnalysis(package.scala:42) 
     at org.apache.spark.sql.catalyst.analysis.CheckAnalysis$$anonfun$checkAnalysis$1$$anonfun$apply$2.applyOrElse(CheckAnalysis.scala:60) 

C'è un altro modo per rilasciare una colonna che non fallirebbe su questo tipo di dati?

risposta

15

Va bene, mi sembra di aver trovato la soluzione, dopo tutto:

df.drop(df.col("raw.hourOfWeek")) sembra funzionare

+0

risposta utile. Ma ho un'altra domanda simile. Supponiamo di avere circa 100 colonne in Spark Dataframe. C'è un modo per selezionare solo poche colonne da questo dataframe e creare un altro dataframe con quelle colonne selezionate? qualcosa come df2 = df1.select (df.col ("col1", "col2")) – JKC

+0

penso questo https://stackoverflow.com/questions/36131716/scala-spark-dataframe-dataframe-select-multiple-columns -given-a-sequence-of-co risponde alla tua domanda – MrE

0
val data = df.drop("Customers"); 

funziona bene per le colonne normali

val new = df.drop(df.col("old.column")); 
+0

il punto era per le colonne con un punto nel nome. – MrE

+0

Grazie per aver segnalato @MrE –