基于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来构建一个无服务器的数据查询分析服务。

相关推荐
青火coding11 小时前
SOFAServerless架构的意义
java·运维·中间件·架构·serverless
China_Yanhy1 天前
AWS 全链路监控 (Application Signals/X-Ray) + EKS 实战落地指南
云计算·aws
China_Yanhy2 天前
[特殊字符] AWS 区块链交易系统架构结案白皮书
系统架构·区块链·aws
brave_zhao2 天前
spoon如何连接carte如何将.ktr任务或者.kjb任务提交个远程carte服务让,carte的服务端来执行 etl脚本的任务呢?
数据仓库·etl
翼龙云_cloud3 天前
亚马逊云渠道商:RDS 三大数据库引擎深度对比 MySQL/PostgreSQL/SQL Server 如何选?
数据库·mysql·postgresql·aws
China_Yanhy3 天前
生产级 Amazon MSK (Express 模式) 架构构建与选型实战白皮书
架构·kafka·云计算·aws
Serverless社区3 天前
探秘 AgentRun|基于 Serverless 的 AI Agent 沙箱工程化之路
运维·阿里云·云原生·serverless·函数计算
DO_Community4 天前
海外云 AWS、GCP、Azure 与 DigitalOcean 的核心区别有哪些?
人工智能·云计算·azure·aws·谷歌云·digitalocean
zhojiew5 天前
在springboot4中使用ADOT的agent注入集成cwagent发送数据和追踪
aws
Serverless 社区5 天前
进阶指南:BrowserUse + Agentrun Sandbox 最佳实践指南
人工智能·云原生·serverless