我是使用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存储桶中。
我的问题是:可以这么说,我在脚本中没有看到数据被“加载”的任何地方。我知道我将其指向由搜寻器生成的表,但来自this doc:
AWS Glue中的表和数据库是AWS Glue数据目录中的对象。它们包含元数据;它们不包含数据存储中的数据。
如果表仅包含元数据,那么ETL作业如何从数据存储(在我的情况下为S3存储桶)中检索文件?我之所以这样问,主要是因为我想以某种方式修改ETL作业以在另一个存储桶中转换结构相同的文件,而不必编写新的搜寻器,而且还因为我想加强对Glue服务的一般理解。
答案 0 :(得分:2)
主要要了解的是: Glue数据源目录(数据库和表)始终与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数据目录源表创建初始数据帧方面为您神奇,除了元数据,架构和表属性外,它的Location也指向您的数据存储(s3位置),您的数据所在的位置。
完成applymapping
之后,这部分代码(数据库)正在将数据实际加载到目标集群/数据库中。
datasink2 = glueContext.write_dynamic_frame.from_options(frame = applymapping1, connection_type = "s3", connection_options = {"path": "s3://myoutputbucket"}, format = "json", transformation_ctx = "datasink2")
答案 1 :(得分:0)