You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在多个AWS EMR步骤间复用Spark SQL视图/表?

问题解答

你忽略的核心点

createGlobalTempView的作用范围是同一个Spark应用(Application)内的不同SparkSession,而你通过两次spark-submit提交的是两个完全独立的Spark应用——每个spark-submit都会启动一个新的Spark Application,拥有独立的SparkContext和资源隔离,所以第一个应用里创建的全局视图,在第二个应用里根本看不到。

会话和步骤的区别

  • SparkSession(会话):是同一个Spark应用内的交互上下文,一个应用可以创建多个Session,这些Session共享同一个SparkContext,所以global_temp视图能在同应用的不同Session间共享。
  • 你的“步骤”:是两次独立的spark-submit任务,每个任务对应一个全新的Spark应用,彼此的运行环境、资源、元数据完全隔离,和同应用内的会话不是一个概念。

跨步骤复用数据的方案

  • 持久化到外部存储:第一步处理完数据后,将DataFrame写入S3(推荐Parquet/ORC列式存储格式),或者注册到EMR关联的Hive Metastore(创建外部表或管理表)。第二步直接从S3读取数据,或者查询Hive表,这是最通用的跨应用复用方式。
    示例代码(第一步写S3):
    df.write.mode("overwrite").parquet("s3://your-bucket/path/to/data")
    
    示例代码(第二步读S3):
    val df = spark.read.parquet("s3://your-bucket/path/to/data")
    
  • 合并到同一个Spark应用:把两个步骤的逻辑写到同一个代码文件里,用一次spark-submit提交,这样两个任务属于同一个应用,就能直接用createGlobalTempView跨Session访问,或者直接复用DataFrame对象。
  • 使用EMR步骤链:如果需要通过EMR的步骤管理器提交,可将多个步骤配置为同一个应用内的任务,或者用Shell脚本触发同应用内的多任务执行,本质还是依托同一个Spark应用实现数据共享。

内容的提问来源于stack exchange,提问作者Rajat Goel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 00:05:16