如何查询spark spark中的特殊列

时间:2018-01-13 08:28:57

标签: spark-streaming

我从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)
顺便说一句,它在火花中没问题但在流媒体方面失败了。 有谁知道吗?

1 个答案:

答案 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"),只需调用上述内容。

希望,这有帮助。