全球临时观点的目的是什么?

时间:2018-03-05 10:32:46

标签: apache-spark apache-spark-sql pyspark-sql

尝试了解如何使用Spark Global临时视图。

在一个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()

另一方面,我试图访问它,但没有成功(没有找到表或视图)。

 #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的用途是什么,它在哪里有用?

由于

2 个答案:

答案 0 :(得分:2)

您可以在spark documentation中看到

  

如果您想拥有一个在所有会话中共享的临时视图   并保持活着直到Spark应用程序终止,您可以创建   全球临时观点。

只要应用程序处于活动状态,全局表仍可访问。 打开一个新的shell并为它提供相同的应用程序只会创建一个新的应用程序。

你可以尝试在同一个shell中测试它:

spark.newSession.sql("SELECT * FROM global_temp.my_cars").show()

please see my answer on a similar question获取更详细的示例以及Spark应用程序和Spark会话的简短定义

答案 1 :(得分:0)

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

<强> df.createGlobalTempView( “人”)