Apache spark 从EMR迁移到AWS后,在Spark SQL中找不到表

Apache spark 从EMR迁移到AWS后,在Spark SQL中找不到表,apache-spark,amazon-emr,aws-glue,Apache Spark,Amazon Emr,Aws Glue,我在EMR上有Spark作业,EMR被配置为使用配置单元和Spark元数据的粘合目录 我创建了配置单元外部表,它们出现在Glue目录中,我的Spark作业可以在Spark SQL中引用它们,如Spark.sqlselect*from Hive_table 现在,当我尝试在一个粘合作业中运行相同的代码时,它失败了,出现了TableNotFound错误。看起来Glue作业不像Spark SQL在EMR中运行那样使用Spark SQL的Glue目录 我可以通过使用Glue API和将数据帧注册为临时视

我在EMR上有Spark作业,EMR被配置为使用配置单元和Spark元数据的粘合目录

我创建了配置单元外部表,它们出现在Glue目录中,我的Spark作业可以在Spark SQL中引用它们,如Spark.sqlselect*from Hive_table

现在,当我尝试在一个粘合作业中运行相同的代码时,它失败了,出现了TableNotFound错误。看起来Glue作业不像Spark SQL在EMR中运行那样使用Spark SQL的Glue目录

我可以通过使用Glue API和将数据帧注册为临时视图来解决这个问题:

从目录创建动态框架…toDF.createOrReplaceTempView


但有没有一种方法可以自动做到这一点

应该使用SparkSession.builder.enableHiveSupport.getOrCreate,而不是使用SparkContext.getOrCreate,enableHiveSupport是缺少的重要部分。我认为可能发生的情况是,您的Spark作业实际上不是在Glue中创建表,而是在Spark的嵌入式配置单元元存储中创建表,因为您尚未启用配置单元支持。

您应该使用SparkSession.builder.enableHiveSupport.getOrCreate,而不是使用SparkContext.getOrCreate,enableHiveSupport是缺少的重要部分。我认为可能发生的情况是,您的Spark作业实际上并不是在Glue中创建表,而是在Spark的嵌入式Hive metastore中创建表,因为您尚未启用Hive支持。

这是一个期待已久的功能请求,将Glue Data Catalog与最近发布的Glue ETL作业一起使用。 创建新作业时,您会发现以下选项

使用粘合数据目录作为配置单元元存储


您还可以通过编辑作业并在作业参数中添加-enable glue datacatalog(启用glue datacatalog,不提供任何值)来为现有作业启用它。这是一个等待已久的功能请求,用于最近发布的glue ETL作业。 创建新作业时,您会发现以下选项

使用粘合数据目录作为配置单元元存储


您还可以通过编辑作业并在作业参数中添加-enable glue datacatalog(如果没有值)来为现有作业启用它,但也存在相同的问题。它在我的开发端点上工作,但不是实际的ETL工作。通过将作业从Spark 2.2编辑到Spark 2.4,可以修复此问题

也有同样的问题。它在我的开发端点上工作,但不是实际的ETL工作。通过将作业从Spark 2.2编辑到Spark 2.4,可以修复此问题

您是如何创建spark对象的?您是否使用它启用了enableHiveSupport?glueContext=GlueContextSparkContext.getOrCreate,然后spark=glueContext.spark_会话您是否正在尝试在EMR中运行粘合作业?否,相反,尝试在粘合上运行在EMR中可用的东西。您是如何创建spark对象的?您是否使用它启用了enableHiveSupport?glueContext=GlueContextSparkContext.getOrCreate,然后spark=glueContext.spark_会话您是否正在尝试在EMR中运行粘合作业?不,相反,尝试在Glue上运行EMR中可用的东西。