Skip to content
Snippets Groups Projects
Commit 9081b9f9 authored by Cheng Lian's avatar Cheng Lian Committed by Michael Armbrust
Browse files

[SPARK-2189][SQL] Adds dropTempTable API

This PR adds an API for unregistering temporary tables. If a temporary table has been cached before, it's unpersisted as well.

Author: Cheng Lian <lian.cs.zju@gmail.com>

Closes #3039 from liancheng/unregister-temp-table and squashes the following commits:

54ae99f [Cheng Lian] Fixes Scala styling issue
1948c14 [Cheng Lian] Removes the unpersist argument
aca41d3 [Cheng Lian] Ensures thread safety
7d4fb2b [Cheng Lian] Adds unregisterTempTable API
parent 06232d23
No related branches found
No related tags found
No related merge requests found
...@@ -103,6 +103,19 @@ private[sql] trait CacheManager { ...@@ -103,6 +103,19 @@ private[sql] trait CacheManager {
cachedData.remove(dataIndex) cachedData.remove(dataIndex)
} }
/** Tries to remove the data for the given SchemaRDD from the cache if it's cached */
private[sql] def tryUncacheQuery(
query: SchemaRDD,
blocking: Boolean = true): Boolean = writeLock {
val planToCache = query.queryExecution.analyzed
val dataIndex = cachedData.indexWhere(cd => planToCache.sameResult(cd.plan))
val found = dataIndex >= 0
if (found) {
cachedData(dataIndex).cachedRepresentation.cachedColumnBuffers.unpersist(blocking)
cachedData.remove(dataIndex)
}
found
}
/** Optionally returns cached data for the given SchemaRDD */ /** Optionally returns cached data for the given SchemaRDD */
private[sql] def lookupCachedData(query: SchemaRDD): Option[CachedData] = readLock { private[sql] def lookupCachedData(query: SchemaRDD): Option[CachedData] = readLock {
......
...@@ -276,6 +276,19 @@ class SQLContext(@transient val sparkContext: SparkContext) ...@@ -276,6 +276,19 @@ class SQLContext(@transient val sparkContext: SparkContext)
catalog.registerTable(None, tableName, rdd.queryExecution.logical) catalog.registerTable(None, tableName, rdd.queryExecution.logical)
} }
/**
* Drops the temporary table with the given table name in the catalog. If the table has been
* cached/persisted before, it's also unpersisted.
*
* @param tableName the name of the table to be unregistered.
*
* @group userf
*/
def dropTempTable(tableName: String): Unit = {
tryUncacheQuery(table(tableName))
catalog.unregisterTable(None, tableName)
}
/** /**
* Executes a SQL query using Spark, returning the result as a SchemaRDD. The dialect that is * Executes a SQL query using Spark, returning the result as a SchemaRDD. The dialect that is
* used for SQL parsing can be configured with 'spark.sql.dialect'. * used for SQL parsing can be configured with 'spark.sql.dialect'.
......
...@@ -231,4 +231,24 @@ class CachedTableSuite extends QueryTest { ...@@ -231,4 +231,24 @@ class CachedTableSuite extends QueryTest {
assert(cached.statistics.sizeInBytes === actualSizeInBytes) assert(cached.statistics.sizeInBytes === actualSizeInBytes)
} }
} }
test("Drops temporary table") {
testData.select('key).registerTempTable("t1")
table("t1")
dropTempTable("t1")
assert(intercept[RuntimeException](table("t1")).getMessage.startsWith("Table Not Found"))
}
test("Drops cached temporary table") {
testData.select('key).registerTempTable("t1")
testData.select('key).registerTempTable("t2")
cacheTable("t1")
assert(isCached("t1"))
assert(isCached("t2"))
dropTempTable("t1")
assert(intercept[RuntimeException](table("t1")).getMessage.startsWith("Table Not Found"))
assert(!isCached("t2"))
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment