AWS Glue抓取动态S3路径位置

时间:2019-04-04 18:20:14

标签: apache-spark pyspark amazon-cloudformation aws-glue

我正在AWS Glue中创建一个ETL作业,该作业将从S3位置提取存储库中每个实体的最新编辑或当前数据。存储库中的数据是对实体进行所有编辑的历史记录。每天我运行ETL,它都会写到另一个S3位置,即Bucket / path / to / files / current_date / ...,其中当前日期是动态的,并且与ETL运行的日期一致。

我遇到的问题是我无法以编程方式从S3(组织限制)中删除,也无法移动文件,因为这是一个副本并在后台删除,因此它也失败了,只留下一条路径供胶水爬行。我想设置搜寻器,以使路径的日期部分是动态的,但我仍无法找到一种方法来做到这一点-有人知道这是否可行吗?

我的数据按run_date(请参见上面的当前日期)以及其他6个分层分区进行分区。我正在通过Yaml语言CloudFormation创建搜寻器和ETL作业。搜寻器的路径存储为CloudFormation脚本中定义的ssm参数。

路径SSM参数示例

S3CurrentPath:
    Type: AWS::SSM::Parameter
    Properties:
      Description: "Path in the S3 Lake where the current entity data is stored."
      Type: String
      Value: 'Data/Entities/Software/SoftwareCurrent'
      Name: "/org/member/local/s3/path/entityCurrent"

搜寻器资源代码:

GenericCrawler:
    Type: AWS::Glue::Crawler
    Properties:
      Role: !Ref RoleNAme
      Name: !Sub "${ProfileName}-crawler-${CrawlerName}"
      Configuration: !Sub |
        {
          "Version": 1.0,
          "CrawlerOutput": {
            "Partitions": { "AddOrUpdateBehavior": "InheritFromTable" },
            "Tables": { "AddOrUpdateBehavior": "MergeNewColumns" }
          }
        }
      Description: !Ref CrawlerDescription
      DatabaseName: !Ref DatabaseName
      Targets:
        S3Targets:
          - Path: !Sub "s3://${S3DataBucket}/${S3Path}"

ETL DataSink编写代码:

# Write the joined dynamic frame out to a datasink
        datasink = glueContext.write_dynamic_frame.from_options(
                frame = final_dynamic_frame, connection_type = "s3",
                connection_options = {
                    'path': 's3://{lakeBucketName}/{lakePath}/'.format(
                        lakeBucketName=args['lakeBucketName'],
                        lakePath=args['lakeDestinationPath']),
                        "partitionKeys": ['run_date','location','year','month','day','hour','timestamp']},
                format = "parquet",
                transformation_ctx = "datasink")

我希望爬虫将查看存储库中的最新日期,即最新的run_date分区“文件夹”,并在不回溯旧数据的情况下对其进行爬网。

如果您想查看更多代码,请告诉我-我很乐意进行清理和提供。

1 个答案:

答案 0 :(得分:1)

说实话,我还没有找到使用AWS Glue将数据读取/写入动态路径的方法。我通常要做的是使用PySpark方法进行读取/写入:

datasink.write.\
        format("com.databricks.spark.csv").\
        option("header", "true").\
        mode("overwrite").\
        save("s3://my-bucket/files/" + current_date + "*.csv")

您甚至可以告诉该方法仅读取/写入特定类型的文件(例如.csv)。 与AWS Glue相比,PySpark具有更多的选项和可用方法,因此具有更大的灵活性。另外,我在DynamoDB表中添加了键/值记录,以保留最新日期的记录。