2017-05-06 7 views
0

を解決することはできません私はこのようなJSONデータを持っている:読書ネストされたJSON - [AnalysisException]列

{ 
    "parent":[ 
     { 
     "prop1":1.0, 
     "prop2":"C", 
     "children":[ 
      { 
       "child_prop1":[ 
        "3026" 
       ] 
      } 
     ] 
     } 
    ] 
} 

スパークからデータを読んだ後、私は、スキーマ、次のGET:今

val df = spark.read.json("test.json") 

df.printSchema 
root 
|-- parent: array (nullable = true) 
| |-- element: struct (containsNull = true) 
| | |-- children: array (nullable = true) 
| | | |-- element: struct (containsNull = true) 
| | | | |-- child_prop1: array (nullable = true) 
| | | | | |-- element: string (containsNull = true) 
| | |-- prop1: double (nullable = true) 
| | |-- prop2: string (nullable = true) 

を、 child_prop1dfから選択します。しかし、それを選択しようとするとorg.apache.spark.sql.AnalysisExceptionになります。このような何か:

df.select("parent.children.child_prop1") 
org.apache.spark.sql.AnalysisException: cannot resolve '`parent`.`children`['child_prop1']' due to data type mismatch: argument 2 requires integral type, however, ''child_prop1'' is of string type.;; 
'Project [parent#60.children[child_prop1] AS child_prop1#63] 
+- Relation[parent#60] json 

    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:82) 
    at org.apache.spark.sql.catalyst.analysis.CheckAnalysis$$anonfun$checkAnalysis$1$$anonfun$apply$2.applyOrElse(CheckAnalysis.scala:74) 
    at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$transformUp$1.apply(TreeNode.scala:310) 
    at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$transformUp$1.apply(TreeNode.scala:310) 
    at org.apache.spark.sql.catalyst.trees.CurrentOrigin$.withOrigin(TreeNode.scala:70) 
    at org.apache.spark.sql.catalyst.trees.TreeNode.transformUp(TreeNode.scala:309) 
    at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$4.apply(TreeNode.scala:307) 
    at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$4.apply(TreeNode.scala:307) 
    at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$5.apply(TreeNode.scala:331) 
    at org.apache.spark.sql.catalyst.trees.TreeNode.mapProductIterator(TreeNode.scala:188) 
    at org.apache.spark.sql.catalyst.trees.TreeNode.transformChildren(TreeNode.scala:329) 
    at org.apache.spark.sql.catalyst.trees.TreeNode.transformUp(TreeNode.scala:307) 
    at org.apache.spark.sql.catalyst.plans.QueryPlan.transformExpressionUp$1(QueryPlan.scala:282) 
    at org.apache.spark.sql.catalyst.plans.QueryPlan.org$apache$spark$sql$catalyst$plans$QueryPlan$$recursiveTransform$2(QueryPlan.scala:292) 
    at org.apache.spark.sql.catalyst.plans.QueryPlan$$anonfun$org$apache$spark$sql$catalyst$plans$QueryPlan$$recursiveTransform$2$1.apply(QueryPlan.scala:296) 
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234) 
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234) 
    at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59) 
    at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48) 
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:234) 
    at scala.collection.AbstractTraversable.map(Traversable.scala:104) 
    at org.apache.spark.sql.catalyst.plans.QueryPlan.org$apache$spark$sql$catalyst$plans$QueryPlan$$recursiveTransform$2(QueryPlan.scala:296) 
    at org.apache.spark.sql.catalyst.plans.QueryPlan$$anonfun$7.apply(QueryPlan.scala:301) 
    at org.apache.spark.sql.catalyst.trees.TreeNode.mapProductIterator(TreeNode.scala:188) 
    at org.apache.spark.sql.catalyst.plans.QueryPlan.transformExpressionsUp(QueryPlan.scala:301) 
    at org.apache.spark.sql.catalyst.analysis.CheckAnalysis$$anonfun$checkAnalysis$1.apply(CheckAnalysis.scala:74) 
    at org.apache.spark.sql.catalyst.analysis.CheckAnalysis$$anonfun$checkAnalysis$1.apply(CheckAnalysis.scala:67) 
    at org.apache.spark.sql.catalyst.trees.TreeNode.foreachUp(TreeNode.scala:128) 
    at org.apache.spark.sql.catalyst.analysis.CheckAnalysis$class.checkAnalysis(CheckAnalysis.scala:67) 
    at org.apache.spark.sql.catalyst.analysis.Analyzer.checkAnalysis(Analyzer.scala:57) 
    at org.apache.spark.sql.execution.QueryExecution.assertAnalyzed(QueryExecution.scala:48) 
    at org.apache.spark.sql.Dataset$.ofRows(Dataset.scala:63) 
    at org.apache.spark.sql.Dataset.org$apache$spark$sql$Dataset$$withPlan(Dataset.scala:2822) 
    at org.apache.spark.sql.Dataset.select(Dataset.scala:1121) 
    at org.apache.spark.sql.Dataset.select(Dataset.scala:1139) 
    ... 48 elided 

私はそれが正常に動作のみchildrendfから選択したときに、けれども。

df.select("parent.children").show(false) 
+------------------------------------+ 
|children       | 
+------------------------------------+ 
|[WrappedArray([WrappedArray(3026)])]| 
+------------------------------------+ 

列がデータフレームに存在しているにもかかわらず、それは例外を与えている理由を私は理解できません。

ご協力いただきましてありがとうございます。

+0

に従うことができます

import org.apache.spark.sql.functions.explode val data = spark.read.json("src/test/java/data.json") val child = data.select(explode(data("parent.children"))).toDF("children") child.select(explode(child("children.child_prop1"))).toDF("child_prop1").show() 

としてデータを取得するために爆発します。あなたの 'dataframe'に' Parent'という列が1つしかない場合、 'children'または' parent.children.child_prop1'をどのように選択できますか? –

+0

@RameshMaharjan 'df.select(" parent.children ")。show(false)'の出力で質問を更新しました。私はこれが助けて欲しい! – himanshuIIITian

+0

jsonを '{" parent ":{" prop1 ":1.0、" prop2 ":" C "、" children ":{" child_prop1 ":[" 3026 "]}}}'に変更しようとする必要があります。その後、それは動作します。 –

答えて

0

あなたのJSONは、私はあなたがあなたを変更する必要はありませんだと思うし、有効なJSONでの支援を期待

+--------------------+ 
|child_prop1   | 
+--------------------+ 
|[WrappedArray(3026)]| 
+--------------------+ 

を発生します入力データ。あなたは、入力データを変更することができる場合

使用すると、あなたは子供だけを選択したときの出力とあなたの質問を更新してください@ramesh提案

+0

答えをありがとう! 'explode'を使うとうまく動作しますが、' explode'を使わずに 'child_prop1'を選択する方法はありませんか? – himanshuIIITian

0

child_prop1は、ルート配列parentnested arrayの内側にあります。したがって、child_prop1positionを定義する必要があります。また、定義するエラーが示唆していることがあります。
json形式を変換することはすべきことです。
変更json

{"parent":{"prop1":1.0,"prop2":"C","children":{"child_prop1":["3026"]}}} 

へと

+-----------+ 
|child_prop1| 
+-----------+ 
|[3026]  | 
+-----------+ 

そして
を変更するような出力を与えるだろう

df.select("parent.children.child_prop1").show(false) 

を適用json

{"parent":{"prop1":1.0,"prop2":"C","children":[{"child_prop1":["3026"]}]}} 

df.select("parent.children.child_prop1").show(false) 

を適用すると、私は答えは

関連する問題