【问题标题】:What is the purpose of global temporary views?全局临时视图的目的是什么?
【发布时间】:2018-03-05 10:32:46
【问题描述】:

试图了解如何使用 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()

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

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

谢谢

【问题讨论】:

  • 您能分享一下您尝试访问视图的代码吗?
  • 嗨,我在问题中添加了代码
  • 它可能无关但可能会跳过SparkSession初始化,因为它在您初始化spark-shell时已经初始化。既然您的代码看起来很合理,您是否还可以包含您收到的错误消息?
  • 我添加了错误信息。你能在你的机器上执行相同的代码吗(当然有不同的表)?
  • 你能连接到 Hive 吗?如果是,请检查表 my_cars 是否存在。

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


【解决方案1】:

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 会话的简短定义

【讨论】:

  • 谢谢 Avi,我想我的问题是您如何实际实现这种长期存在的应用程序,您可以在其中交互式地创建和关闭会话。
  • 这取决于你想做什么。在批处理作业中,您可以打开多个会话来做不同的事情。完成后批处理作业终止。手头上的 Streaming Context 保持打开状态,并将定期执行。
  • @Dan 如果您以交互方式创建和关闭会话,那么它不是一个长时间运行的应用程序。 global_temp 视图用于在用户之间共享数据,我不会将它们用作应用程序的共享内存空间或 IPC。如果您有需要共享数据的单独进程,请将其保存到永久表或文件中。如果它打算成为一个长时间运行的数据处理管道,请使用 spark-submit 命令行将 jar 或 python 脚本发送到带有命令行参数的集群,或者为您的 spark 分发提供适当的 API。它将在单个 spark 中运行会话。
【解决方案2】:

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

df.createGlobalTempView("people")

【讨论】:

    猜你喜欢
    • 2010-09-29
    • 2011-05-29
    • 2013-06-05
    • 1970-01-01
    • 2021-03-29
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多