我是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
,但每当我使用列名而不是*时,就会出现错误。
有什么建议吗?
这是SPARK-5009,已在Apache SPARK 1.3.0中修复。
问题是,为了在任何情况下识别关键字(如SELECT
),所有可能的大小写组合(如seLeCT
)都是在递归函数中生成的。如果关键字足够长,堆栈大小足够小,这种递归将导致您看到的StackOverflowError
。(这表明,如果不能升级到Apache Spark 1.3.0或更高版本,可以使用-Xss
来增加JVM堆栈大小作为解决方法。)