从AWS Glue作业中引用Hive视图

时间:2019-01-29 15:02:50

标签: amazon-web-services apache-spark hive aws-glue

我试图弄清楚如何将用例从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内引用该视图工作。

1 个答案:

答案 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")