Skip to content
Snippets Groups Projects
Commit de934e67 authored by gatorsmile's avatar gatorsmile Committed by Wenchen Fan
Browse files

[SPARK-19236][SQL][FOLLOW-UP] Added createOrReplaceGlobalTempView method

### What changes were proposed in this pull request?
This PR does the following tasks:
- Added  since
- Added the Python API
- Added test cases

### How was this patch tested?
Added test cases to both Scala and Python

Author: gatorsmile <gatorsmile@gmail.com>

Closes #18147 from gatorsmile/createOrReplaceGlobalTempView.
parent d0f36bcb
No related branches found
No related tags found
No related merge requests found
......@@ -191,6 +191,23 @@ class DataFrame(object):
"""
self._jdf.createGlobalTempView(name)
@since(2.2)
def createOrReplaceGlobalTempView(self, name):
"""Creates or replaces a global temporary view using the given name.
The lifetime of this temporary view is tied to this Spark application.
>>> df.createOrReplaceGlobalTempView("people")
>>> df2 = df.filter(df.age > 3)
>>> df2.createOrReplaceGlobalTempView("people")
>>> df3 = spark.sql("select * from global_temp.people")
>>> sorted(df3.collect()) == sorted(df2.collect())
True
>>> spark.catalog.dropGlobalTempView("people")
"""
self._jdf.createOrReplaceGlobalTempView(name)
@property
@since(1.4)
def write(self):
......
......@@ -2786,6 +2786,7 @@ class Dataset[T] private[sql](
* view, e.g. `SELECT * FROM _global_temp.view1`.
*
* @group basic
* @since 2.2.0
*/
def createOrReplaceGlobalTempView(viewName: String): Unit = withPlan {
createTempViewCommand(viewName, replace = true, global = true)
......
......@@ -35,39 +35,47 @@ class GlobalTempViewSuite extends QueryTest with SharedSQLContext {
private var globalTempDB: String = _
test("basic semantic") {
sql("CREATE GLOBAL TEMP VIEW src AS SELECT 1, 'a'")
try {
sql("CREATE GLOBAL TEMP VIEW src AS SELECT 1, 'a'")
// If there is no database in table name, we should try local temp view first, if not found,
// try table/view in current database, which is "default" in this case. So we expect
// NoSuchTableException here.
intercept[NoSuchTableException](spark.table("src"))
// If there is no database in table name, we should try local temp view first, if not found,
// try table/view in current database, which is "default" in this case. So we expect
// NoSuchTableException here.
intercept[NoSuchTableException](spark.table("src"))
// Use qualified name to refer to the global temp view explicitly.
checkAnswer(spark.table(s"$globalTempDB.src"), Row(1, "a"))
// Use qualified name to refer to the global temp view explicitly.
checkAnswer(spark.table(s"$globalTempDB.src"), Row(1, "a"))
// Table name without database will never refer to a global temp view.
intercept[NoSuchTableException](sql("DROP VIEW src"))
// Table name without database will never refer to a global temp view.
intercept[NoSuchTableException](sql("DROP VIEW src"))
sql(s"DROP VIEW $globalTempDB.src")
// The global temp view should be dropped successfully.
intercept[NoSuchTableException](spark.table(s"$globalTempDB.src"))
sql(s"DROP VIEW $globalTempDB.src")
// The global temp view should be dropped successfully.
intercept[NoSuchTableException](spark.table(s"$globalTempDB.src"))
// We can also use Dataset API to create global temp view
Seq(1 -> "a").toDF("i", "j").createGlobalTempView("src")
checkAnswer(spark.table(s"$globalTempDB.src"), Row(1, "a"))
// We can also use Dataset API to create global temp view
Seq(1 -> "a").toDF("i", "j").createGlobalTempView("src")
checkAnswer(spark.table(s"$globalTempDB.src"), Row(1, "a"))
// Use qualified name to rename a global temp view.
sql(s"ALTER VIEW $globalTempDB.src RENAME TO src2")
intercept[NoSuchTableException](spark.table(s"$globalTempDB.src"))
checkAnswer(spark.table(s"$globalTempDB.src2"), Row(1, "a"))
// Use qualified name to rename a global temp view.
sql(s"ALTER VIEW $globalTempDB.src RENAME TO src2")
intercept[NoSuchTableException](spark.table(s"$globalTempDB.src"))
checkAnswer(spark.table(s"$globalTempDB.src2"), Row(1, "a"))
// Use qualified name to alter a global temp view.
sql(s"ALTER VIEW $globalTempDB.src2 AS SELECT 2, 'b'")
checkAnswer(spark.table(s"$globalTempDB.src2"), Row(2, "b"))
// Use qualified name to alter a global temp view.
sql(s"ALTER VIEW $globalTempDB.src2 AS SELECT 2, 'b'")
checkAnswer(spark.table(s"$globalTempDB.src2"), Row(2, "b"))
// We can also use Catalog API to drop global temp view
spark.catalog.dropGlobalTempView("src2")
intercept[NoSuchTableException](spark.table(s"$globalTempDB.src2"))
// We can also use Catalog API to drop global temp view
spark.catalog.dropGlobalTempView("src2")
intercept[NoSuchTableException](spark.table(s"$globalTempDB.src2"))
// We can also use Dataset API to replace global temp view
Seq(2 -> "b").toDF("i", "j").createOrReplaceGlobalTempView("src")
checkAnswer(spark.table(s"$globalTempDB.src"), Row(2, "b"))
} finally {
spark.catalog.dropGlobalTempView("src")
}
}
test("global temp view is shared among all sessions") {
......@@ -106,7 +114,7 @@ class GlobalTempViewSuite extends QueryTest with SharedSQLContext {
test("CREATE TABLE LIKE should work for global temp view") {
try {
sql("CREATE GLOBAL TEMP VIEW src AS SELECT 1 AS a, '2' AS b")
sql(s"CREATE TABLE cloned LIKE ${globalTempDB}.src")
sql(s"CREATE TABLE cloned LIKE $globalTempDB.src")
val tableMeta = spark.sessionState.catalog.getTableMetadata(TableIdentifier("cloned"))
assert(tableMeta.schema == new StructType().add("a", "int", false).add("b", "string", false))
} finally {
......
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