scala中的Spark SQL执行
我有一个包含SQL查询和viewname的数据(alldata)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
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)
}