Amazon S3 与 AWS Glue 集成
使用 AWS Glue 将数据存储在 Amazon S3 中
Amazon S3(简单存储服务)是一种灵活可靠的存储,非常适合管理大型数据集。AWS Glue 是一种提取、转换和加载 (ETL) 服务,当 Amazon S3 与其集成时,数据的管理和处理变得非常容易。
使用 AWS Glue 将数据存储在 Amazon S3 中的好处
以下列出了使用 AWS Glue 将数据存储在 Amazon S3 中的主要好处 −
- 使用 AWS Glue 将数据存储在 S3 中可轻松访问存储在 S3 存储桶中的数据。我们可以直接在 S3 数据上运行 ETL 作业,并将其转换为有意义的格式。
- 借助 Glue Crawlers,AWS Glue 可以自动检测存储在 S3 存储桶中的数据的模式。它使我们能够更快、更高效地查询数据。
- 使用 AWS Glue 内置的 Apache Spark 环境,我们可以转换存储在 Amazon S3 存储桶中的数据。
如何使用 AWS Glue 在 Amazon S3 中存储和处理数据?
使用下面给出的步骤使用 AWS Glue 在 S3 存储桶中存储和处理数据 −
步骤 1:设置您的 Amazon S3 存储桶 − 在使用 AWS Glue 之前,您必须将数据存储在 Amazon S3 存储桶中。您可以通过两种方式将数据集上传到 S3 存储桶中,手动或通过文件传输等自动化流程。
步骤 2:创建 Glue 爬虫 − 现在,将数据放入 S3 存储桶后,您可以设置 Glue 爬虫,它将扫描您的 S3 存储桶、提取元数据并将其保存在 Glue 数据目录中。
步骤 3:定义并运行 ETL 作业 − 创建元数据后,您现在可以在 AWS Glue 中创建 ETL 作业来处理存储在 S3 存储桶中的数据。
步骤 4:查询和分析数据 − 处理完数据后,您可以使用 Amazon Athena 等 AWS 服务查询数据。您还可以将其加载到 Amazon Redshift 等数据仓库中,以进行进一步分析。
使用 Amazon S3 管理 AWS Glue 作业中的分区
使用 Amazon S3 时,管理 AWS Glue 中的分区对于优化性能和降低处理成本非常重要。
分区,顾名思义,根据日期、区域或产品等特定键将数据集划分为更小但更易于管理的部分。换句话说,分区是一种将大型数据集组织成更小的逻辑段的方法。
例如,
s3://your-bucket-name/data/year=2023/month=09/day=27/
在此示例中,数据按年、月、日进行分区。
在 AWS Glue 中设置分区
按照下面给出的步骤在 AWS Glue 中设置分区 −
步骤 1:在 Amazon S3 中对数据进行分区 − 使用基于分区键(例如年、月、日)的目录结构在 Amazon S3 中组织数据。例如,s3://my-bucket/sales_data/year=2023/month=09/day=27/。
步骤 2:配置 AWS Glue 爬虫程序 − 在 S3 中拥有分区数据后,创建并配置 AWS Glue 爬虫程序。爬虫程序将自动识别文件夹结构并将分区信息添加到 Glue 数据目录。
步骤 3:创建或修改 Glue 作业 − 您可以创建或修改 Glue ETL 作业。在这两种情况下,都引用 Glue 数据目录中的分区数据。AWS Glue 将使用此信息仅处理必要的分区。
使用 DynamicFrames 管理分区
为了轻松管理分区数据,AWS Glue 提供了 DynamicFrames。您可以使用 from_catalog 函数加载分区数据,并使用 filter 函数处理特定分区。让我们看下面的一个例子 −
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 sc = SparkContext() glueContext = GlueContext(sc) spark = glueContext.spark_session # 从 Glue 数据目录加载分区数据 dynamic_frame = glueContext.create_dynamic_frame.from_catalog(database="my_database", table_name="sales_data") # 筛选特定年份和月份的数据 filtered_frame = dynamic_frame.filter(f => f["year"] == "2023" and f["month"] == "09") # 继续 ETL 流程 -----------------
上述脚本将根据年份和月份筛选数据。然后,它会执行 ETL 流程中定义的转换或操作。最终输出将写入您的 Amazon S3 存储桶。