我从kafka获得了一个json in spark streaming,:
{"name":"name","value1":"value1"}
{"name":"name","value1":"value1","value2":"value2"}
阅读并获取其架构:
val df = spark.read.json(rdd.map(_._2))
df.printSchema() //shows
//--name
//--values1
// --values2
df.createOrReplaceTempView("df")
spark.sql("select name,values2 from df")
但它会输出:
顺便说一句,它在火花中没问题但在流媒体方面失败了。 有谁知道吗?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:77) 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.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)
答案 0 :(得分:1)
似乎您的代码在语法上不正确, Catalyst优化器,而分析您的查询,无法使用目录解析所有引用强>
.json()
方法采用路径或 RDD [String] ;不是表达。
您的代码稍有变化,我想这将解决此错误。请在下面找到。
<强> 1。使用Spark Sql AST
您似乎正在使用AST(因为您将其注册为TempView)。将您的代码 spark.read.json(&#34;选择名称,值d2从df&#34;)更改为以下内容。
spark.sql("select name,values2 from df")
<强> 2。使用Spark Sql DSL
在不创建TempView的情况下,您也可以实现相同的目标(我更喜欢这个,因为DSL中的代码本质上更加清晰)。
df.select("name","values2")
在这种情况下,只需跳过代码df.createOrReplaceTempView("df")
,只需调用上述内容。
希望,这有帮助。