基于AWS Serverless的Glue服务进行ETL(提取、转换和加载)数据分析(二)——数据清洗、转换

2 数据清洗、转换

此实验使用S3作为数据源

ETL:

E extract 输入

T transform 转换

L load 输出

大纲

  • [2 数据清洗、转换](#2 数据清洗、转换)
    • [2.1 架构图](#2.1 架构图)
    • [2.2 数据清洗](#2.2 数据清洗)
    • [2.3 编辑脚本](#2.3 编辑脚本)
      • [2.3.1 连接数据源(s3)](#2.3.1 连接数据源(s3))
      • [2.3.2. 数据结构转换](#2.3.2. 数据结构转换)
      • [2.3.2 数据结构拆分、定义](#2.3.2 数据结构拆分、定义)
      • [2.3.3 清洗后的数据写入新s3](#2.3.3 清洗后的数据写入新s3)
      • [2.3.4 运行作业](#2.3.4 运行作业)
    • [2.4 数据分区](#2.4 数据分区)
      • [2.4.1 编辑脚本](#2.4.1 编辑脚本)
      • [2.4.2 运行脚本](#2.4.2 运行脚本)
    • [2.5 总结](#2.5 总结)

2.1 架构图

2.2 数据清洗

此步会将S3中的原始数据清洗成我们想要的自定义结构的数据。之后,我们可通过APIGateway+Lambda+Athena来实现一个无服务器的数据分析服务。

步骤 图例
1、入口
2、创建Job(s3作为数据源,则Type选择Spark,若为Kinesis等,选择Stream Spark)
3、IAM角色需要有s3与Glue的权限
4、选择s3脚本位置,若已经完成脚本的编写工作,则可以选择第二项或第三项,若无则Glue会提供默认脚本
5、安全配置参数 建议:添加参数--enable-auto-scaling为true。每次在我们执行Job任务时,会根据运行 ETL 任务的数据处理单元(DPU)的个数来分配动态IP,在我们子网的动态IP数低于DPU数时,Job将会执行失败。此参数将会动态分配IP。
6、数据源()
7、数据目标(我们会将清洗后的数据存储到新的s3桶)
8、设计架构(在本案例中,我们会自定义脚本。所以不再在此处设计架构)(此处设计后,脚本会自动生成相关代码)
9、保存

2.3 编辑脚本

脚本中的args参数的键值需要从Job的安全配置参数中定义

2.3.1 连接数据源(s3)

python 复制代码
#数据源
datasource = glueContext.create_dynamic_frame.from_catalog(database = args['db_name'], table_name = tableName, transformation_ctx = "datasource")

2.3.2. 数据结构转换

python 复制代码
mapped_readings = ApplyMapping.apply(frame = datasource, mappings = [("lclid", "string", "meter_id", "string"), \
                                                                     ("datetime", "string", "reading_time", "string"), \
                                                                     ("KWH/hh (per half hour)", "double", "reading_value", "double")], \
                                     transformation_ctx = "mapped_readings")

2.3.2 数据结构拆分、定义

python 复制代码
mapped_readings_df = DynamicFrame.toDF(mapped_readings)

mapped_readings_df = mapped_readings_df.withColumn("obis_code", lit(""))
mapped_readings_df = mapped_readings_df.withColumn("reading_type", lit("INT"))

reading_time = to_timestamp(col("reading_time"), "yyyy-MM-dd HH:mm:ss")
mapped_readings_df = mapped_readings_df \
    .withColumn("week_of_year", weekofyear(reading_time)) \
    .withColumn("date_str", regexp_replace(col("reading_time").substr(1,10), "-", "")) \
    .withColumn("day_of_month", dayofmonth(reading_time)) \
    .withColumn("month", month(reading_time)) \
    .withColumn("year", year(reading_time)) \
    .withColumn("hour", hour(reading_time)) \
    .withColumn("minute", minute(reading_time)) \
    .withColumn("reading_date_time", reading_time) \
    .drop("reading_time")

2.3.3 清洗后的数据写入新s3

python 复制代码
# write data to S3
filteredMeterReads = DynamicFrame.fromDF(mapped_readings_df, glueContext, "filteredMeterReads")

s3_clean_path = "s3://" + args['clean_data_bucket']

glueContext.write_dynamic_frame.from_options(
    frame = filteredMeterReads,
    connection_type = "s3",
    connection_options = {"path": s3_clean_path},
    format = "parquet",
    transformation_ctx = "s3CleanDatasink")

2.3.4 运行作业

执行成功后,状态将变为"SUCCESS",失败将会给出失败信息,可在CloudWatch 中查看详情

清洗后的数据保存到了s3


数据清洗完毕后,可通过上一篇中的爬网程序步骤,将清洗后的数据的结构创建表到数据目录中,
此时我们可以使用Athena对清洗后的数据进行分析。

2.4 数据分区

接下来我们对数据进行分区处理(此处只提供了按天分区)

重新进行数据清洗中的创建Job操作后,重写脚本

2.4.1 编辑脚本

连接数据源。表为上一步最后重新爬取生成的新表。

python 复制代码
cleanedMeterDataSource = glueContext.create_dynamic_frame.from_catalog(database = args['db_name'], table_name = tableName, transformation_ctx = "cleanedMeterDataSource")

根据type与data_str分区

python 复制代码
business_zone_bucket_path_daily = "s3://{}/daily".format(args['business_zone_bucket'])

businessZone = glueContext.write_dynamic_frame.from_options(frame = cleanedMeterDataSource, \
    connection_type = "s3", \
    connection_options = {"path": business_zone_bucket_path_daily, "partitionKeys": ["reading_type", "date_str"]},\
    format = "parquet", \
    transformation_ctx = "businessZone")

2.4.2 运行脚本

分区后的数据结果:

再次创建、运行爬网程序,将会在数据目录中生成新的分区表。

2.5 总结

到这一步,我们已经使用Glue ETL对s3桶中的数据进行了清洗、分区操作。在进行上篇中的Athena操作后,我们已经可以通过Athena直接查询到清洗、分区后的数据集了。

接下来,我们会通过使用APIGateway+Lambda+Athena来构建一个无服务器的数据查询分析服务。

相关推荐
AskHarries2 天前
AWS S3 如何设置公开访问权限?
后端·aws
技术程序猿华锋3 天前
Claude 3.7 Sonnet 泄露,Anthropic 最先进 AI 模型即将在 AWS Bedrock 上首次亮相
人工智能·云计算·claude·aws
IT考试认证4 天前
AWS云从业者认证题库 AWS Cloud Practitioner(2.21)
aws·云从
AWS官方合作商4 天前
AWS S3深度解析:十大核心应用场景与高可用架构设计实践
云计算·aws·数据湖·对象存储·存储·s3
IT考试认证4 天前
AWS云从业者认证题库 AWS Cloud Practitioner
云计算·aws·云从业者
sealaugh325 天前
aws(学习笔记第二十九课) aws cloudfront hands on
笔记·学习·aws
不剪发的Tony老师5 天前
Apache Hop:开源版本的Kettle
数据仓库·etl
AWS官方合作商5 天前
Amazon Lex:AI对话引擎重构企业服务新范式
人工智能·ai·机器人·aws
Anna_Tong6 天前
阿里云 ACS:高效、弹性、低成本的容器计算解决方案
人工智能·阿里云·容器·kubernetes·serverless·云计算·devops
阿里云大数据AI技术6 天前
美的楼宇科技基于阿里云 EMR Serverless Spark 构建 LakeHouse 湖仓数据平台
大数据·阿里云·spark·serverless·emr