亚马逊AWS官方博客

使用 AWS Glue 和 Amazon Athena 实现无服务器的自主型机器学习

您是否遇到过需要根据某些属性划分数据集的情况?K-means 是用于划分数据的最常见的机器学习算法之一。该算法能够将数据分成不同的组 (称为集群)。每个样本都被分配到一个集群,这样,相比分配到其他集群中的样本,分配到同一集群中的样本彼此之间更相似。

在这篇博客文章中,我将介绍使用 AWS Glue 提取位于 Amazon S3 上有关出租车行驶情况的数据集,并使用 K-means 根据行车坐标将数据分成 100 个不同的集群。然后,我会使用 Amazon Athena 查询行驶次数和每个集群的大概区域。最后,我会使用 Amazon Athena 来计算行驶次数最多的四个区域的坐标。使用 AWS Glue 和 Amazon Athena 都可以执行这些任务,无需预置或管理服务器。

解决方案概述

我将使用在以前的博客文章中用过的纽约市出租车数据集:使用 AWS Glue、Amazon Athena 和 Amazon QuickSight 协调、查询和可视化各个提供商的数据。我将使用 2016 年 1 月份包含绿色出租车行驶数据的表。

我将向您展示 AWS Glue 作业脚本,该脚本使用 Spark 机器学习 K-means 集群库,基于坐标划分数据集。该脚本通过加载绿色出租车数据并添加指示每一行被分配到哪个集群的列来执行作业。该脚本采用 parquet 格式将表保存到 Amazon s3 存储桶 (目标文件)。可以使用 Amazon Athena 查询存储桶。

我们来考虑下面这个问题:将出租车行驶数据集平均分配到所有已注册接客地点之间的 100 个不同的组 (集群) 中 (接客地点由 pickup_longitudepickup_latitude 列指定)。为了解决这个问题,AWS Glue 脚本要读取输入表,然后使用 Spark 机器学习库实现 K-means,并将集群数量设为 100。结果采用 parquet 格式存储在 Amazon S3 存储桶中,您可以使用 Amazon Athena 进行查询。

演示

执行 AWS Glue 作业

请遵循以下步骤:

  1. 在 AWS 管理控制台中,转到 AWS Glue 控制台。为 AWS Glue 爬网程序 (在数据目录中创建表定义) 创建要将表写入其中的新数据库。
  2. 创建一个指向以下路径的新爬网程序:
    s3://serverless-analytics/glue-blog -- 设置为按需运行

  3. 运行该爬网程序。

    确保爬网程序对包含以下属性的绿色表进行分类。
  4. 将脚本文件 MLkmeans.py 上传到其中一个 S3 存储桶中。
  5. 添加新的 AWS Glue 作业,为该作业选择一个名称和角色,从“您提供的现有脚本”中选择运行作业的选项,再选择已上传脚本的 S3 路径,然后为临时文件选择 S3 路径。选择两次 Next,然后选择 Finish。
  6. 编辑脚本。
    • 选择作业,然后选择要编辑的选项:
    • 编辑您要将结果存储到其中的 destination 变量 (下图中的第 17 行)。
    • 使用以前运行的爬网程序所创建绿表的数据库和表名称编辑 namespacetablename (下图中的第 18 和 19 行)。
  7. 运行 AWS Glue 作业。
  8. 验证是否已在目标路径中创建 parquet 文件。
  9. 创建一个指向目标路径的新爬网程序。
  10. 在目标路径上运行爬网程序,以在 AWS Glue 数据目录中创建指向新转换数据集的新表。

如何使用 Athena 查询结果

在爬网程序完成对 AWS Glue 提取、转换和加载 (ETL) 作业创建的 parquet 数据集的分析后,数据目录中应生成一个具有以下列的表:

预测列由 k-means 算法添加,并包含一个表示分配给每行的集群 ID 的整数。

我们来看一个例子,在 Amazon Athena 中用下面的查询列出所有计算的集群:

SELECT  count(*) as count, 
     (max(pickup_latitude) - min(pickup_latitude))*(max(pickup_longitude) - min(pickup_longitude)) 
as approximate_cluster_area , prediction  
FROM RESULTDATABASE.RESULTTABLENAME group by prediction  order by prediction 

当您将 RESULTDATABASE.RESULTTABLENAME 替换为您的结果表名称和数据库时,查询应类似于以下内容:

结果显示由 count (计数) 列描述的每个地理区域内的出租车接客次数,以及由 approximate_cluster_area 列描述的每个地区覆盖的面积。

我们来看另一个例子,列出活动最多的 10 个集群并计算其中心坐标:

 SELECT count(*) AS count,
         avg(pickup_latitude) AS latitute,
         avg(pickup_longitude) AS longitude,
         prediction
FROM RESULTDATABASE.RESULTTABLENAME
GROUP BY  prediction
ORDER BY  count DESC limit 10

当您将 RESULTDATABASE.RESULTTABLENAME 替换为您的结果表名称和数据库时,查询应类似于以下内容:

结果将显示行驶次数最多的 10 个集群。如果我们使用 Amazon Quicksight 地理空间可视化功能在地图上绘制这些坐标,会得到一个类似于下图的图像:

总结

在这篇博客文章中,您学到了如何利用 AWS Glue 和 Amazon Athena 来使用自主型机器学习算法,而无需启动或管理服务器。在示例中,我们基于行车坐标将一个出租车行驶数据集分成 100 个不同的组。使用每个组的区域和行驶次数等查询数据,可以计算出坐标。

本博客中介绍的解决方案还可以用于其他数据集,只需稍加修改。您可以使用这些解决方案解决您自己的使用案例需求。我期待收到您的反馈意见和建议。


补充阅读

了解如何通过 AWS 构建基于 PMML 的应用程序并生成预测


作者简介

Luis Caro 是 AWS 专业服务的大数据顾问。他与我们的客户合作,为大数据项目提供指导和技术支持,帮助他们提高使用 AWS 实现的解决方案价值。