【问题标题】:Create or Replace AWS Glue Crawler创建或替换 AWS Glue 爬虫
【发布时间】:2020-03-09 14:52:49
【问题描述】:

使用boto3

  1. 是否可以检查 AWS Glue Crawler 是否已存在,如果不存在则创建它?
  2. 如果它已经存在,我需要更新它。
  3. 爬虫创建脚本是什么样子的?

这是否类似于 RDBMS 中的CREATE OR REPLACE TABLE...

有人做过这个或有建议吗?

谢谢你:) 迈克尔

【问题讨论】:

    标签: python amazon-web-services boto3 aws-glue aws-glue-data-catalog


    【解决方案1】:

    据我所知,没有用于此的 API。我们使用 list_crawlers 手动列出爬虫并遍历列表以决定是否添加或更新爬虫(update_crawler)。

    查看 API @ https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/glue.html

    【讨论】:

      【解决方案2】:

      是的,您可以使用boto3 完成所有这些操作,但是,没有一个函数可以同时完成所有这些操作。相反,您必须进行以下一系列 API 调用:

      每次这些函数都会返回响应,您需要手动解析/验证/检查。

      AWS 的文档非常好,所以一定要检查一下。它可能看起来势不可挡,但在开始时,您可能会发现很容易复制和粘贴他们在文档中提供的请求系统,然后删除不必要的部分等。虽然boto3 对自动完成/建议非常有帮助,但有一个可以帮助解决 mypy_boto3_builder 及其前身 mypy_boto3boto3_type_annotations 的项目。

      如果出现问题,即您没有正确指定某些参数,它们的错误响应非常好并且很有帮助。

      这是一个如何列出所有现有爬虫的示例

      import boto3
      from pprint import pprint
      
      client = boto3.client('glue')
      response = client.list_crawlers()
      available_crawlers = response["CrawlerNames"]
      
      for crawler_name in available_crawlers:
          response = client.get_crawler(Name=crawler_name)
          pprint(response)
      

      假设您在 IAM 中拥有 AWSGlueServiceRoleDefault 并拥有胶水爬虫所需的所有权限,您可以通过以下方式创建一个:

      response = client.create_crawler(
          Name='my-crawler-via-api',
          Role='AWSGlueServiceRoleDefault',
          Description='Crawler generated with Python API',  # optional
          Targets={
              'S3Targets': [
                  {
                      'Path': 's3://some/path/in/s3/bucket',
                  },
              ],
          },
      )
      

      【讨论】:

        【解决方案3】:

        我最终使用了标准的 Python 异常处理:

        #Instantiate the glue client.
        glue_client = boto3.client(
            'glue', 
            region_name = 'us-east-1'
        )
        
        #Attempt to create and start a glue crawler on PSV table or update and start it if it already exists.
        try:
            glue_client.create_crawler(
                Name = 'crawler name',
                Role = 'role to be used by glue to create the crawler',
                DatabaseName = 'database where the crawler should create the table',
                Targets = 
                {
                    'S3Targets': 
                    [
                        {
                            'Path':'full s3 path to the directory that crawler should process'
                        }
                    ]
                }
            )
            glue_client.start_crawler(
                Name = 'crawler name'
            )
        except:
            glue_client.update_crawler(
                Name = 'crawler name',
                Role = 'role to be used by glue to create the crawler',
                DatabaseName = 'database where the crawler should create the table',
                Targets = 
                {
                    'S3Targets': 
                    [
                        {
                            'Path':'full s3 path to the directory that crawler should process'
                        }
                    ]
                }
            )
            glue_client.start_crawler(
                Name = 'crawler name'
            )
        

        【讨论】:

        • 我建议的一件事是参数化爬虫配置,即输入到create_crawlerupdate_crawlerstart_crawler 也是如此,实际上可以从 try/except 中取出
        猜你喜欢
        • 1970-01-01
        • 2022-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-14
        • 2019-12-26
        • 1970-01-01
        • 2020-03-09
        相关资源
        最近更新 更多