scala中的Spark SQL执行

scala中的Spark SQL执行,scala,apache-spark,Scala,Apache Spark,我有一个包含SQL查询和viewname的数据(alldata) Select_Query|viewname select v1,v2 from conditions|cond select w1,w2 from locations|loca 我已拆分并正确地将其分配给可诱惑的(alldata) 当我试图执行查询并从中注册一个tempview或表时,它显示的是null指针错误。但是当我注释掉spark.sql stmt时,PRINTLN显示了表中的所有值 Select_Querydf.for

我有一个包含SQL查询和viewname的数据(alldata)

Select_Query|viewname
select v1,v2 from conditions|cond
select w1,w2 from locations|loca
我已拆分并正确地将其分配给可诱惑的(alldata)

当我试图执行查询并从中注册一个tempview或表时,它显示的是null指针错误。但是当我注释掉spark.sql stmt时,PRINTLN显示了表中的所有值

 Select_Querydf.foreach{row => 
          val Selectstmt = row(0).toString()
          val viewname = row(1).toString()
          println(Selectstmt+"-->"+viewname)
      spark.sql(Selectstmt).registerTempTable(viewname)//.createOrReplaceTempView(viewname)
       }
但是,当我使用spark.sql执行它时,它显示了以下错误,请帮助我指出哪里出了问题

2009年12月19日02:43:12错误执行者:第4.0阶段任务0.0中出现异常 (TID 4)java.lang.NullPointerException位于 org.apache.spark.sql.SparkSession.sessionState$lzycompute(SparkSession.scala:128) 在 org.apache.spark.sql.SparkSession.sessionState(SparkSession.scala:126) 位于org.apache.spark.sql.SparkSession.sql(SparkSession.scala:623) sparkscalacode1.SQLQueryexecutewithheader$$anonfun$main$1.apply(SQLQueryexecutewithheader.scala:36) 在 sparkscalacode1.SQLQueryexecutewithheader$$anonfun$main$1.apply(SQLQueryexecutewithheader.scala:32) 位于scala.collection.Iterator$class.foreach(Iterator.scala:891) scala.collection.AbstractIterator.foreach(迭代器.scala:1334)位于 org.apache.spark.rdd.rdd$$anonfun$foreach$1$$anonfun$apply$28.apply(rdd.scala:918) 在 org.apache.spark.rdd.rdd$$anonfun$foreach$1$$anonfun$apply$28.apply(rdd.scala:918) 在 org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:2062) 在 org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:2062) 位于org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87) 位于org.apache.spark.scheduler.Task.run(Task.scala:108) org.apache.spark.executor.executor$TaskRunner.run(executor.scala:335) 位于java.util.concurrent.ThreadPoolExecutor.runWorker(未知源) 位于java.util.concurrent.ThreadPoolExecutor$Worker.run(未知源) 在java.lang.Thread.run(未知源代码)19/12/09 02:43:12错误 TaskSetManager:阶段4.0中的任务0失败1次;中止工作 线程“main”org.apache.spark.sparkeException中的异常:作业 由于阶段失败而中止:阶段4.0中的任务0失败1次,最多 最近的失败:在阶段4.0中丢失了任务0.0(TID 4,本地主机,executor 驱动程序):java.lang.NullPointerException位于 org.apache.spark.sql.SparkSession.sessionState$lzycompute(SparkSession.scala:128) 在 org.apache.spark.sql.SparkSession.sessionState(SparkSession.scala:126) 位于org.apache.spark.sql.SparkSession.sql(SparkSession.scala:623) sparkscalacode1.SQLQueryexecutewithheader$$anonfun$main$1.apply(SQLQueryexecutewithheader.scala:36) 在 sparkscalacode1.SQLQueryexecutewithheader$$anonfun$main$1.apply(SQLQueryexecutewithheader.scala:32) 位于scala.collection.Iterator$class.foreach(Iterator.scala:891) scala.collection.AbstractIterator.foreach(迭代器.scala:1334)位于 org.apache.spark.rdd.rdd$$anonfun$foreach$1$$anonfun$apply$28.apply(rdd.scala:918) 在 org.apache.spark.rdd.rdd$$anonfun$foreach$1$$anonfun$apply$28.apply(rdd.scala:918) 在 org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:2062) 在 org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:2062) 位于org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87) 位于org.apache.spark.scheduler.Task.run(Task.scala:108) org.apache.spark.executor.executor$TaskRunner.run(executor.scala:335) 位于java.util.concurrent.ThreadPoolExecutor.runWorker(未知源) 位于java.util.concurrent.ThreadPoolExecutor$Worker.run(未知源) 位于java.lang.Thread.run(未知源)


这里的
spark.sql
SparkSession
不能用于数据帧的
foreach
Sparksession
在驱动程序中创建,而
foreach
在worker中执行,且未序列化

我希望您有一个小列表,用于
选择_Querydf
,如果是这样,您可以收集为列表并按如下方式使用它

Select_Querydf.collect().foreach { row =>
  val Selectstmt = row.getString(0)
  val viewname = row.getString(1)
  println(Selectstmt + "-->" + viewname)
  spark.sql(Selectstmt).createOrReplaceTempView(viewname)
}

希望这有帮助

因为不能在执行器中执行驱动程序代码,所以不能这样做。执行者对spark会话和/或上下文一无所知,因此您会得到异常。您唯一可以使用诸如
spark.sql(Selectstmt).registerTempable(viewname)/.createOrReplaceTempView(viewname)
之类的代码的地方是DriverTanks Alexandros。但是你能给我建议一种方法吗。我有一个包含5行5个不同sql查询的数据框架。如果我必须一个接一个地执行,怎么做?但我希望它在驱动程序代码中。让我粘贴完整的代码。太好了,成功了。。对spark来说是个新手,试着做一些自我规划。非常感谢。。
output:
select v1,v2 from conditions-->cond
select w1,w2 from locations-->loca
Select_Querydf.collect().foreach { row =>
  val Selectstmt = row.getString(0)
  val viewname = row.getString(1)
  println(Selectstmt + "-->" + viewname)
  spark.sql(Selectstmt).createOrReplaceTempView(viewname)
}