Spark SQL Stackoverflow
Я новичок в искро и искрах sql, и я пытался сделать пример, который находится на сайте Spark SQL, просто простой SQL-запрос после загрузки схемы и данных из каталога файлов JSON, например:
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
, но всякий раз, когда я использую имя столбца вместо *, я получаю ошибку.
Любой совет?
Ответы
Ответ 1
Это SPARK-5009 и исправлено в Apache Spark 1.3.0.
Проблема заключалась в том, что для распознавания ключевых слов (например, SELECT
) в любом случае в рекурсивной функции генерировались все возможные комбинации в верхнем и нижнем регистре (например, SELECT
). Эта рекурсия приведет к StackOverflowError
, который вы видите, если ключевое слово было достаточно длинным, а размер стека достаточно мал. (Это говорит о том, что если обновление до Apache Spark 1.3.0 или более поздней версии не является вариантом, вы можете использовать -Xss
для увеличения размера стека JVM в качестве обходного пути.)