2017-07-05 2 views
0

内の特定の要素を見つける: select("File.columns.column._name")私はspaecific要素を選択するネストされたXMLファイルのスパークスカラ

|-- File: array (nullable = true) 
| |-- element: struct (containsNull = true) 
| | |-- _Description: string (nullable = true) 
| | |-- _RowTag: string (nullable = true) 
| | |-- _name: string (nullable = true) 
| | |-- _type: string (nullable = true) 
| | |-- columns: struct (nullable = true) 
| | | |-- column: array (nullable = true) 
| | | | |-- element: struct (containsNull = true) 
| | | | | |-- _Hive_Final_Table: string (nullable = true) 
| | | | | |-- _Hive_Final_column: string (nullable = true) 
| | | | | |-- _Hive_Table1: string (nullable = true) 
| | | | | |-- _Hive_column1: string (nullable = true) 
| | | | | |-- _Path: string (nullable = true) 
| | | | | |-- _Type: string (nullable = true) 
| | | | | |-- _VALUE: string (nullable = true) 
| | | | | |-- _name: string (nullable = true) 

私はこのエラーを得た:

org.apacheスレッドの例外「メイン」 .spark.sql.AnalysisException: データ型の不一致により 'File.columns.column [_name]'を解決できません: 引数2は整数型が必要ですが、 '_name'は文字列 型です。 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:65) 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:335) (org.apache.spark.sql.catalyst.trees.TreeNode $$ anonfun $ transformUp $ 1)にあります。 org.apache.spark.sql.catalyst.trees.CurrentOrigin $ .withOrigin(TreeNode.scala:69)の に適用(TreeNode.scala:334) またはg.apache.spark.sql.catalyst.trees.TreeNode $$ anonfun $ 5.apply(TreeNode.scala:332) at org.apache.spark.sql.catalyst.trees.TreeNode $$ anonfun $ 5.apply(TreeNode。スカラー:332) at org.apache.spark.sql.catalyst.trees.TreeNode $$ anonfun $ 4.apply(TreeNode.scala:281) at scala.collection.Iterator $$ anon $ 11.next(Iterator.scala: (Iterator.scala:727) scala.collection.AbstractIterator.foreach(Iterator.scala:1157) scala.collection.generic.Growable $ class。$ plusにあります。 $ plus $ plus $ eq(ArrayBuffer.scala:103) scala.collection.mutable.ArrayBufferに$ plus $ eq(Growable.scala:48) を追加しました。 (ArrayBuffer.scala:47) at scala.collection.Tra scala.collection.TraversableOnce $ class.toBuffer(TraversableOnce.scala:265) のscala.collection.AbstractIterator.to(Iterator.scala:1157) にある$ class.to(TraversableOnce.scala:273) をscalaに配置します。 scale.toArray(TraversableOnce.scala:252) at scala.collection.AbstractIterator.toArray(Iterator.scala:1157) at org .AbstractIterator.toBuffer(Iterator.scala:1157) は、scala.collection.TraversableOnce $ class.toArray(TraversableOnce.scala:252)にあります。 apache.spark.sql.catalyst.trees.TreeNode.transformChildren(TreeNode.scala:321) at org.apache.spark.sql.catalyst.trees.TreeNode.transformUp(TreeNode.scala:332) at org.apache。 spark.sql.catalyst.plans.QueryPlan.transformExpressionUp $ 1(QueryPlan.scala:108) at org.apache.spark.sql.catalyst.pla nQueryPlan.org $ apache $ spark $ sql $ catalyst $ plans $ QueryPlan $$ recursiveTransform $ 2(QueryPlan.scala:118)

私を助けてくれますか?

答えて

0

あなたは必要な列

explode(Column e) が指定した配列またはマップ列の各要素の新しい行を作成します取得するにはexplode機能を必要としています。

val df1 = df.select(explode($"File").as("File")).select($"File.columns").as("column") 

まず、爆発

val finalDF = df1.select(explode($"(column"))."column")).select($"column._name").as("_name") 

あなたcolumnフィールドを与える第二の爆発あなたにこのことができます_name

希望を与えます!

0

あなたはdataframe

import org.apache.spark.sql.functions._ 
df.select(col("File.columns.column")(0)(0)("_name").as("_name")) 
から、ネストされた構造体から _nameを選択するために、次の操作を行うことができますあなたのスキーマを見ます
関連する問題