2016-03-14 11 views
9

DataFrameに列をドロップしようとしましたが、エスケープした列名にドットが含まれています。Spark 1.6:エスケープされた列名を持つDataFrameのドロップ列

私が脱出する前に、私のスキーマは次のようになります。

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 = 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) 

注意を名前にドットが付いた列。 私はカラム名をエスケープせずに多くを行うように見えることができませんでしたので、私はにスキーマを変換:

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) 

それは助けていないようです。私はまだ同じエラーが発生します。

すべての列名をエスケープしてエスケープされた名前を使用してドロップしようとしましたが、どちらも機能しません。

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) 

このタイプのデータで失敗しない列を削除する別の方法はありますか?

答えて

15

さてさて、私はすべての後に解決策を見つけているように見える:

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

+0

便利な答えを正常に動作します動作するようです。しかし、私はもう一つの似たような質問があります。 Spark Dataframeに約100列あるとします。このデータフレームからわずかな数の列を選択し、選択した列で別のデータフレームを作成する方法はありますか? df2 = df1.select(df.col( "col1"、 "col2"))のようなもの – JKC

+0

これはhttps://stackoverflow.com/questions/36131716/scala-spark-dataframe-dataframe-select-multiple-columnsだと思います-given-a-sequence-of-coはあなたの質問に答えます – MrE

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

は、通常の列に対して

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

ポイントには名前にドットが付いた列がポイントでした。 – MrE

+0

@MrEを指摘してくれてありがとう –

関連する問題