【问题标题】:Create tables in Glue Data Catalog for data in S3 and unknown schema在 Glue 数据目录中为 S3 和未知模式中的数据创建表
【发布时间】:2020-12-04 05:53:37
【问题描述】:

我当前的用例是,在一个基于 ETL 的服务中(NOTE:ETL 服务没有使用 Glue ETL,它是一个独立的服务),我从 AWS Redshift 集群获取一些数据到 S3。然后将 S3 中的数据输入到 T 和 L 作业中。我想将元数据填充到 Glue 目录中。最基本的解决方案是使用 Glue Crawler,但爬虫运行大约 1 小时 20 分钟(很多 s3 分区)。我遇到的另一个解决方案是使用 Glue API。但是,我同样面临数据类型定义的问题。

有什么办法,我可以创建/更新我在 S3 中有数据的 Glue 目录表,并且只有在提取过程中才知道数据类型。

而且,当 T 和 L 作业正在运行时,数据类型应该在目录中随时可用。

【问题讨论】:

  • 您的用例中有多少个表?
  • 会有很多表,粘合目录将仅用作填充到 S3 中的数据的目录。一天内将有大约 100 个作业在运行,生成 500-600 GB 的数据。
  • 得到了一些线索,红移“CREATE EXTERNAL TABLE AS”在创建新表时很有用,它也会将数据加载到 S3 中。当表中有更新时,例如添加新分区,我将使用 Athena MSCK REPAIR TABLE 来获取表中的分区。但是,我仍在寻找优化的解决方案,因为 MSCK 无法很好地扩展,并且运行时间会随着数据集大小的增加而增加。

标签: amazon-web-services amazon-s3 amazon-redshift aws-glue aws-glue-data-catalog


【解决方案1】:

为了在您的 ETL 过程中创建、更新数据目录,您可以使用以下方法:

更新

additionalOptions = {"enableUpdateCatalog": True, "updateBehavior": "UPDATE_IN_DATABASE"}
additionalOptions["partitionKeys"] = ["partition_key0", "partition_key1"]

sink = glueContext.write_dynamic_frame_from_catalog(frame=last_transform, database=<dst_db_name>,
                                                    table_name=<dst_tbl_name>, transformation_ctx="write_sink",
                                                    additional_options=additionalOptions)
job.commit()

以上内容可用于更新架构。您还可以选择设置updateBehavior,在LOGUPDATE_IN_DATABASE (default) 之间进行选择。

创建

要在 ETL 期间在数据目录中创建新表,您可以按照以下示例进行操作:

sink = glueContext.getSink(connection_type="s3", path="s3://path/to/data",
                           enableUpdateCatalog=True, updateBehavior="UPDATE_IN_DATABASE",
                           partitionKeys=["partition_key0", "partition_key1"])
sink.setFormat("<format>")
sink.setCatalogInfo(catalogDatabase=<dst_db_name>, catalogTableName=<dst_tbl_name>)
sink.writeFrame(last_transform)

您可以使用setCatalogInfo 指定数据库和新表名。

您还可以选择使用enableUpdateCatalog 参数然后指定partitionKeys更新数据目录中的分区

更详细的功能说明见here

【讨论】:

  • 当您的 ETL 作业仅在 Glue 上时,这种方法不是吗?我的 ETL 作业没有在 Glue 上运行。
  • 用于胶水。您的问题要求 Glue 数据目录。也许如果你能更具体一点,也许你能得到更准确的答案。
  • 感谢您指出这一点,我将在问题中添加并改写它。
【解决方案2】:

找到了问题的解决方案,我最终使用了 Glue Catalog API 来使其无缝且快速。 我创建了一个与 Glue 目录交互的接口,并为各种数据源覆盖这些方法。在数据加载到 S3 之后,我立即触发查询以从源获取架构,然后接口开始工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-30
    • 2020-08-23
    • 2021-06-16
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多