2016-03-14 11 views
9

Próbujesz upuścić kolumnę w DataFrame, ale mam nazwy kolumn z kropkami w nich, z których uciekłem.Spark 1.6: upuść kolumnę w DataFrame ze zmienionymi nazwami kolumn

Zanim uciec, mój schemat wygląda tak:

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) 

Gdy próbuję upuść kolumnę, otrzymuję:

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) 

Zauważ, że ja nie próbując nawet spaść na kolumny z kropkami w nazwie. Ponieważ nie wydaje się zrobić wiele bez ucieczki nazwy kolumn, I konwertowane do schematu:

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) 

ale nie wydaje się, aby pomóc. Wciąż dostaję ten sam błąd.

Próbowałem wymykając się wszystkimi nazwami kolumn i upuszczając je przy użyciu nazwy ewakuowanej, ale to też nie działa.

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) 

Czy istnieje inny sposób na upuszczenie kolumny, która nie zawiedzie na tego typu danych?

Odpowiedz

15

porządku, wydaje mi się, że znalazłem rozwiązanie po wszystkim:

df.drop(df.col("raw.hourOfWeek")) wydaje się działać

+0

użytecznej odpowiedzi. Ale mam jeszcze jedno podobne pytanie. Załóżmy, że mam około 100 kolumn w Dataframe Spark. Czy istnieje sposób na wybranie tylko kilku kolumn z tej ramki danych i utworzenie kolejnej ramki danych z wybranymi kolumnami? coś jak df2 = df1.select (df.col ("col1", "col2")) – JKC

+0

Myślę, że to https://stackoverflow.com/questions/36131716/scala-spark-dataframe-dataframe-select-multiple-columns -given-a-sequence-of-co odpowiada na twoje pytanie – MrE

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

będzie działać dobrze dla normalnych kolumn

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

punkt był dla kolumn z kropką w nazwie. – MrE

+0

Dzięki za wskazanie @MrE –

Powiązane problemy