问题 Spark SQL Stackoverflow


我是spark和spark sql的新手,我试图在Spark SQL网站上创建示例,在从JSON文件目录加载模式和数据后只是一个简单的SQL查询,如下所示:

import sqlContext.createSchemaRDD
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
val path = "/home/shaza90/Desktop/tweets_1428981780000"
val tweet = sqlContext.jsonFile(path).cache()

tweet.registerTempTable("tweet")
tweet.printSchema() //This one works fine


val texts = sqlContext.sql("SELECT tweet.text FROM tweet").collect().foreach(println) 

我得到的例外就是这个:

java.lang.StackOverflowError

    at scala.util.parsing.combinator.Parsers$Parser$$anonfun$append$1.apply(Parsers.scala:254)
at scala.util.parsing.combinator.Parsers$$anon$3.apply(Parsers.scala:222)

更新 

我能够执行 select * from tweet 但每当我使用列名而不是*我得到错误。

有什么建议吗?


1697
2018-05-02 02:31


起源

您使用的是哪个版本的Spark? - stholzm
听起来像这个(未解决的)bug: issues.apache.org/jira/browse/SPARK-4208 - stholzm
我的版本是Spark 1.1.0 - Lisa
总是值得尝试最新版本。此外,该错误读作“Affects Version / s:1.1.0” - 它有可能在以后的版本中消失。 - stholzm
是的,您应该使用1.3.x版本,因为Spark SQL主要抽象(SchemaRDD)对DataFrame进行了大量更改 - Olivier Girardot


答案:


这是 SPARK-5009 并已在Apache Spark 1.3.0中修复。

问题在于识别关键字(如 SELECT)任何情况下,所有可能的大写/小写组合(如 seLeCT)是在递归函数中生成的。这种递归会导致 StackOverflowError 你看,如果关键字足够长,堆栈大小足够小。 (这表明如果不能选择升级到Apache Spark 1.3.0或更高版本,则可以使用 -Xss 增加JVM堆栈大小作为解决方法。)


10
2018-05-06 06:36



什么是-Xss?我该怎么改变它? - Lisa
这要归功于stholzm发现SPARK-4208和Sean Owen在不到一个小时前将其作为SPARK-5009的副本关闭:)。 -Xss 是一个 java 命令行标志。例如 -Xss4M 将堆栈大小设置为4 MB(我想这应该足够了)。如果您启动Spark应用程序 spark-submit,我想你需要使用 --conf 标志传递这另一面旗帜。看到 stackoverflow.com/questions/28166667/...。 - Daniel Darabos