全局临时视图的目的是什么?

What is the purpose of global temporary views?

试图了解如何使用 Spark 全局临时视图。

在一个 spark-shell 会话中,我创建了一个视图

spark = SparkSession.builder.appName('spark_sql').getOrCreate()

df = (
spark.read.option("header", "true")
    .option("delimiter", ",")
    .option("inferSchema", "true")
    .csv("/user/root/data/cars.csv"))

df.createGlobalTempView("my_cars")

# works without any problem
spark.sql("SELECT * FROM global_temp.my_cars").show()

在另一台上我尝试访问它,但没有成功(table 或未找到视图)。

 #second Spark Shell 
 spark = SparkSession.builder.appName('spark_sql').getOrCreate()
 spark.sql("SELECT * FROM global_temp.my_cars").show()

这是我收到的错误:

 pyspark.sql.utils.AnalysisException: u"Table or view not found: `global_temp`.`my_cars`; line 1 pos 14;\n'Project [*]\n+- 'UnresolvedRelation `global_temp`.`my_cars`\n"

我读到每个 spark-shell 都有自己的上下文,这就是为什么一个 spark-shell 看不到另一个。所以我不明白,GTV有什么用,有什么用?

谢谢

spark documentation你可以看到:

If you want to have a temporary view that is shared among all sessions and keep alive until the Spark application terminates, you can create a global temporary view.

只要应用程序处于活动状态,全局 table 就可以访问。 打开一个新的 shell 并给它相同的应用程序只会创建一个新的应用程序。

您可以尝试在同一个 shell:

中测试它
spark.newSession.sql("SELECT * FROM global_temp.my_cars").show()

获取更详细的示例以及 Spark 应用程序和 Spark 会话的简短定义

Spark SQL 中的临时视图是 session-scoped,如果创建它的会话终止,它们将消失。如果您希望拥有一个在所有会话之间共享的临时视图并保持活动状态直到 Spark 应用程序终止,您可以创建一个全局临时视图。全局临时视图绑定到系统保留的数据库global_temp,我们必须使用限定名称来引用它,

df.createGlobalTempView("people")