Skip to content

Commit 2591419

Browse files
zsxwingyhuai
authored andcommitted
[SPARK-10155] [SQL] Change SqlParser to object to avoid memory leak
Since `scala.util.parsing.combinator.Parsers` is thread-safe since Scala 2.10 (See [SI-4929](https://issues.scala-lang.org/browse/SI-4929)), we can change SqlParser to object to avoid memory leak. I didn't change other subclasses of `scala.util.parsing.combinator.Parsers` because there is only one instance in one SQLContext, which should not be an issue. Author: zsxwing <zsxwing@gmail.com> Closes apache#8357 from zsxwing/sql-memory-leak. (cherry picked from commit e789000) Signed-off-by: Yin Huai <yhuai@databricks.com>
1 parent 9b74fec commit 2591419

File tree

9 files changed

+19
-19
lines changed

9 files changed

+19
-19
lines changed

sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/AbstractSparkSQLParser.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import org.apache.spark.sql.catalyst.plans.logical._
2828
private[sql] abstract class AbstractSparkSQLParser
2929
extends StandardTokenParsers with PackratParsers {
3030

31-
def parse(input: String): LogicalPlan = {
31+
def parse(input: String): LogicalPlan = synchronized {
3232
// Initialize the Keywords.
3333
initLexical
3434
phrase(start)(new lexical.Scanner(input)) match {

sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/ParserDialect.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ abstract class ParserDialect {
6161
*/
6262
private[spark] class DefaultParserDialect extends ParserDialect {
6363
@transient
64-
protected val sqlParser = new SqlParser
64+
protected val sqlParser = SqlParser
6565

6666
override def parse(sqlText: String): LogicalPlan = {
6767
sqlParser.parse(sqlText)

sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/SqlParser.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@ import org.apache.spark.unsafe.types.CalendarInterval
3737
* This is currently included mostly for illustrative purposes. Users wanting more complete support
3838
* for a SQL like language should checkout the HiveQL support in the sql/hive sub-project.
3939
*/
40-
class SqlParser extends AbstractSparkSQLParser with DataTypeParser {
40+
object SqlParser extends AbstractSparkSQLParser with DataTypeParser {
4141

42-
def parseExpression(input: String): Expression = {
42+
def parseExpression(input: String): Expression = synchronized {
4343
// Initialize the Keywords.
4444
initLexical
4545
phrase(projection)(new lexical.Scanner(input)) match {
@@ -48,7 +48,7 @@ class SqlParser extends AbstractSparkSQLParser with DataTypeParser {
4848
}
4949
}
5050

51-
def parseTableIdentifier(input: String): TableIdentifier = {
51+
def parseTableIdentifier(input: String): TableIdentifier = synchronized {
5252
// Initialize the Keywords.
5353
initLexical
5454
phrase(tableIdentifier)(new lexical.Scanner(input)) match {

sql/core/src/main/scala/org/apache/spark/sql/DataFrame.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -720,7 +720,7 @@ class DataFrame private[sql](
720720
@scala.annotation.varargs
721721
def selectExpr(exprs: String*): DataFrame = {
722722
select(exprs.map { expr =>
723-
Column(new SqlParser().parseExpression(expr))
723+
Column(SqlParser.parseExpression(expr))
724724
}: _*)
725725
}
726726

@@ -745,7 +745,7 @@ class DataFrame private[sql](
745745
* @since 1.3.0
746746
*/
747747
def filter(conditionExpr: String): DataFrame = {
748-
filter(Column(new SqlParser().parseExpression(conditionExpr)))
748+
filter(Column(SqlParser.parseExpression(conditionExpr)))
749749
}
750750

751751
/**
@@ -769,7 +769,7 @@ class DataFrame private[sql](
769769
* @since 1.5.0
770770
*/
771771
def where(conditionExpr: String): DataFrame = {
772-
filter(Column(new SqlParser().parseExpression(conditionExpr)))
772+
filter(Column(SqlParser.parseExpression(conditionExpr)))
773773
}
774774

775775
/**

sql/core/src/main/scala/org/apache/spark/sql/DataFrameWriter.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ final class DataFrameWriter private[sql](df: DataFrame) {
161161
* @since 1.4.0
162162
*/
163163
def insertInto(tableName: String): Unit = {
164-
insertInto(new SqlParser().parseTableIdentifier(tableName))
164+
insertInto(SqlParser.parseTableIdentifier(tableName))
165165
}
166166

167167
private def insertInto(tableIdent: TableIdentifier): Unit = {
@@ -195,7 +195,7 @@ final class DataFrameWriter private[sql](df: DataFrame) {
195195
* @since 1.4.0
196196
*/
197197
def saveAsTable(tableName: String): Unit = {
198-
saveAsTable(new SqlParser().parseTableIdentifier(tableName))
198+
saveAsTable(SqlParser.parseTableIdentifier(tableName))
199199
}
200200

201201
private def saveAsTable(tableIdent: TableIdentifier): Unit = {

sql/core/src/main/scala/org/apache/spark/sql/SQLContext.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -590,7 +590,7 @@ class SQLContext(@transient val sparkContext: SparkContext)
590590
tableName: String,
591591
source: String,
592592
options: Map[String, String]): DataFrame = {
593-
val tableIdent = new SqlParser().parseTableIdentifier(tableName)
593+
val tableIdent = SqlParser.parseTableIdentifier(tableName)
594594
val cmd =
595595
CreateTableUsing(
596596
tableIdent,
@@ -636,7 +636,7 @@ class SQLContext(@transient val sparkContext: SparkContext)
636636
source: String,
637637
schema: StructType,
638638
options: Map[String, String]): DataFrame = {
639-
val tableIdent = new SqlParser().parseTableIdentifier(tableName)
639+
val tableIdent = SqlParser.parseTableIdentifier(tableName)
640640
val cmd =
641641
CreateTableUsing(
642642
tableIdent,
@@ -732,7 +732,7 @@ class SQLContext(@transient val sparkContext: SparkContext)
732732
* @since 1.3.0
733733
*/
734734
def table(tableName: String): DataFrame = {
735-
table(new SqlParser().parseTableIdentifier(tableName))
735+
table(SqlParser.parseTableIdentifier(tableName))
736736
}
737737

738738
private def table(tableIdent: TableIdentifier): DataFrame = {

sql/core/src/main/scala/org/apache/spark/sql/functions.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -796,7 +796,7 @@ object functions {
796796
*
797797
* @group normal_funcs
798798
*/
799-
def expr(expr: String): Column = Column(new SqlParser().parseExpression(expr))
799+
def expr(expr: String): Column = Column(SqlParser.parseExpression(expr))
800800

801801
//////////////////////////////////////////////////////////////////////////////////////////////
802802
// Math Functions

sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveContext.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -291,12 +291,12 @@ class HiveContext(sc: SparkContext) extends SQLContext(sc) with Logging {
291291
* @since 1.3.0
292292
*/
293293
def refreshTable(tableName: String): Unit = {
294-
val tableIdent = new SqlParser().parseTableIdentifier(tableName)
294+
val tableIdent = SqlParser.parseTableIdentifier(tableName)
295295
catalog.refreshTable(tableIdent)
296296
}
297297

298298
protected[hive] def invalidateTable(tableName: String): Unit = {
299-
val tableIdent = new SqlParser().parseTableIdentifier(tableName)
299+
val tableIdent = SqlParser.parseTableIdentifier(tableName)
300300
catalog.invalidateTable(tableIdent)
301301
}
302302

@@ -311,7 +311,7 @@ class HiveContext(sc: SparkContext) extends SQLContext(sc) with Logging {
311311
*/
312312
@Experimental
313313
def analyze(tableName: String) {
314-
val tableIdent = new SqlParser().parseTableIdentifier(tableName)
314+
val tableIdent = SqlParser.parseTableIdentifier(tableName)
315315
val relation = EliminateSubQueries(catalog.lookupRelation(tableIdent.toSeq))
316316

317317
relation match {

sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveMetastoreCatalog.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ private[hive] class HiveMetastoreCatalog(val client: ClientInterface, hive: Hive
199199
options: Map[String, String],
200200
isExternal: Boolean): Unit = {
201201
createDataSourceTable(
202-
new SqlParser().parseTableIdentifier(tableName),
202+
SqlParser.parseTableIdentifier(tableName),
203203
userSpecifiedSchema,
204204
partitionColumns,
205205
provider,
@@ -375,7 +375,7 @@ private[hive] class HiveMetastoreCatalog(val client: ClientInterface, hive: Hive
375375
}
376376

377377
def hiveDefaultTableFilePath(tableName: String): String = {
378-
hiveDefaultTableFilePath(new SqlParser().parseTableIdentifier(tableName))
378+
hiveDefaultTableFilePath(SqlParser.parseTableIdentifier(tableName))
379379
}
380380

381381
def hiveDefaultTableFilePath(tableIdent: TableIdentifier): String = {

0 commit comments

Comments
 (0)