我试图弄清楚如何将用例从EMR迁移到涉及Hive视图的AWS Glue。
在今天的EMR中,我拥有S3中Parquet支持的Hive外部表,并且还有其他视图,例如create view hive_view as select col from external_table where col = x
然后在EMR上的Spark中,我可以发出诸如df = spark.sql("select * from hive_view")
之类的语句来引用我的Hive视图。
我知道我可以使用Glue目录代替Hive元存储库,但是我正在尝试将Spark作业本身从EMR迁移到Glue。因此,在我的最终状态下,不再有Hive端点,只有Glue。
问题:
如果我不再具有发出Hive命令的EMR群集,如何替换create view ...
语句?等效的AWS Glue SDK调用是什么?
如何在Glue作业中引用这些视图?
到目前为止,我已经尝试过:使用boto3
这样调用glue.create_table
glue = boto3.client('glue')
glue.create_table(DatabaseName='glue_db_name',
TableInput = {'Name': 'hive_view',
'TableType': 'VIRTUAL_VIEW',
'ViewExpandedText': 'select .... from ...'
})
我可以看到在Glue目录中创建的对象,但是分类显示为“未知”,并且作业中的引用失败并出现相应的错误:
py4j.protocol.Py4JJavaError: An error occurred while calling o56.getCatalogSource. :
java.lang.Error: No classification or connection in bill_glue_poc.view_test at ...
我已验证我可以在EMR中将带有Hive视图的Spark与Glue目录作为元存储一起使用-我在Glue目录中看到该视图,并且Spark SQL查询成功,但是我无法从Glue内引用该视图工作。
答案 0 :(得分:1)
您可以create a temporary view in Spark并像Hive表(Scala)一样对其进行查询:
val dataDyf = glueContext.getSourceWithFormat(
connectionType = "s3",
format = "parquet",
options = JsonOptions(Map(
"paths" -> Array("s3://bucket/external/folder")
))).getDynamicFrame()
// Convert DynamicFrame to Spark's DataFrame and apply filtering
val dataViewDf = dataDyf.toDF().where(...)
dataViewDf.createOrReplaceTempView("hive_view")
val df = spark.sql("select * from hive_view")