我在EMR上有Spark作业,并且将EMR配置为对Hive和Spark元数据使用Glue目录。
我创建了Hive外部表,它们出现在Glue目录中,我的Spark作业可以在Spark SQL中像spark.sql("select * from hive_table ...")
一样引用它们
现在,当我尝试在Glue作业中运行相同的代码时,它将失败,并显示“找不到表”错误。看来Glue作业没有使用Spark SQL在EMR中运行的相同方式使用Spark SQL的Glue目录。
我可以通过使用Glue API并将数据帧注册为临时视图来解决此问题:
create_dynamic_frame_from_catalog(...).toDF().createOrReplaceTempView(...)
但是有办法自动执行此操作吗?
答案 0 :(得分:1)
这是一个期待已久的功能请求(将Glue数据目录与Glue ETL作业一起使用),最近已发布。 创建新工作时,您会发现以下选项
Use Glue data catalog as the Hive metastore
您还可以通过编辑作业并在不提供值的作业参数中添加--enable-glue-datacatalog
来为现有作业启用该功能
答案 1 :(得分:0)
您应该使用SparkContext.getOrCreate()
,而不要使用SparkSession.builder().enableHiveSupport().getOrCreate()
,其中enableHiveSupport()
是缺少的重要部分。我认为可能发生的情况是,您的Spark作业实际上不是在Glue中创建表,而是在Spark的嵌入式Hive元存储中创建表,因为您尚未启用Hive支持。
答案 2 :(得分:0)
有同样的问题。它在我的Dev端点上工作,但不在实际的ETL工作上。通过将作业从Spark 2.2编辑到Spark 2.4已修复。