首页 文章

AWS Glue ETL作业如何检索数据?

提问于
浏览
0

我是使用AWS Glue的新手,我不明白ETL工作如何收集数据 . 我使用爬虫从S3存储桶中的一些文件生成我的表模式,并检查ETL作业中的自动生成的脚本,这是(稍作修改):

import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job

## @params: [JOB_NAME]
args = getResolvedOptions(sys.argv, ['JOB_NAME'])

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)
datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "mydatabase", table_name = "mytablename", transformation_ctx = "datasource0")
applymapping1 = ApplyMapping.apply(frame = datasource0, mappings = [("data", "string", "data", "string")], transformation_ctx = "applymapping1")
datasink2 = glueContext.write_dynamic_frame.from_options(frame = applymapping1, connection_type = "s3", connection_options = {"path": "s3://myoutputbucket"}, format = "json", transformation_ctx = "datasink2")

当我运行此作业时,它成功地从我的爬虫用于生成表模式的桶中获取数据,并按预期将数据放入我的目标s3存储桶 .

我的问题是:我没有在这个脚本中看到数据是"loaded"的任何地方,可以这么说 . 我知道我将它指向由爬虫生成的表,但来自this doc

AWS Glue中的表和数据库是AWS Glue Data Catalog中的对象 . 它们包含元数据;它们不包含数据存储中的数据 .

如果表只包含元数据,那么ETL作业检索的数据存储(在我的情况下是S3存储桶)中的文件是怎样的?我问的主要是因为我想以某种方式修改ETL作业以在不同的桶中转换相同结构的文件,而不必编写新的爬虫,但也因为我想加强我对Glue服务的一般理解 .

2 回答

  • 1

    如果深入了解AWS Glue Data Catalog . 它有驻留在数据库下的表 . 通过单击这些表,您将看到元数据,该元数据显示由于爬虫运行而导致当前表指向的s3文件夹 .

    您仍然可以通过数据目录选项添加表来手动在s3结构化文件上创建表:

    enter image description here

    并指向你的s3位置 .

    另一种方法是使用AWS-athena控制台创建指向s3位置的表 . 您将使用常规的创建表脚本,其中包含您的s3位置的位置字段 .

  • 0

    需要了解的主要内容是:Glue数据源目录(datebasess和表)始终与Athena同步,Athena是无服务器查询服务,可以使用标准SQL轻松分析Amazon S3中的数据 . 您可以从Glue Console / Athena Query控制台创建表/数据库 .

    datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "mydatabase", table_name = "mytablename", transformation_ctx = "datasource0")
    

    上面的Glue Spark代码行在使用Glue数据目录源表创建初始数据帧时为您带来了神奇的功能,除了元数据,架构和表属性之外,它还具有指向您的数据存储的位置(s3位置),其中您的数据驻留 .

    enter image description here

    applymapping 完成之后,这部分代码(数据链)正在将数据实际加载到目标集群/数据库中 .

    datasink2 = glueContext.write_dynamic_frame.from_options(frame = applymapping1, connection_type = "s3", connection_options = {"path": "s3://myoutputbucket"}, format = "json", transformation_ctx = "datasink2")
    

相关问题