如何在多个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):
示例代码(第二步读S3):df.write.mode("overwrite").parquet("s3://your-bucket/path/to/data")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
相关产品推荐
相关产品推荐

