连接 Amazon S3 中的多个文件中的数据 - Amazon Glue DataBrew
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

连接 Amazon S3 中的多个文件中的数据

使用 DataBrew 控制台中,您可以导航 Amazon S3 存储桶和文件夹,然后为数据集选择文件。但是,数据集不需要限于一个文件。

假设您有一个名为的 S3 存储桶my-databrew-bucket包含名为的文件夹databrew-input. 在该文件夹中,假设你有许多 JSON 文件,所有文件格式都是相同的,.json文件扩展名。在控制台上,您可以指定的源 URLs3://my-databrew-bucket/databrew-input/. 在存储库的 DataBrew 控制台,然后你可以选择此文件夹。您的数据集包含该文件夹中的所有 JSON 文件。

DatabreW 可以处理 S3 文件夹中的所有文件,但前提是满足以下条件:

  • 文件夹中的所有文件具有相同的格式。

  • 文件夹中的所有文件都具有相同的文件扩展名。

有关支持的文件格式和扩展名的更多信息,请参阅DataBrew input formats.

为 Amazon S3 使用参数化路径

在某些情况下,您可能想要创建一个包含遵循特定命名约定的文件的数据集,或者创建一个可以跨越多个 Amazon S3 文件夹的数据集。或者,您可能想重复使用同一数据集来处理在 S3 位置定期生成的结构相同的数据,其路径依赖于特定参数。例如,以数据生产日期命名的路径。

DatabreW 通过参数化 S3 路径支持这种方法。一个参数化路径是包含正则表达式或自定义路径参数的 Amazon S3 URL,或两者兼有。

使用正则表达式定义具有 S3 路径的数据集

路径中的正则表达式可用于匹配一个或多个文件夹中的多个文件,同时过滤掉这些文件夹中的不相关文件。

以下是几个例子:

  • 定义包含名称以开头的文件夹中的所有 JSON 文件的数据集invoice.

  • 使用定义包含文件夹中所有文件的数据集2020在他们的名字里。

您可以通过在数据集 S3 路径中使用正则表达式来实现这种方法。这些正则表达式可以替换 S3 URL 密钥中的任何子字符串(但不能替换存储桶名称)。

作为 S3 URL 中密钥的示例,请参阅以下内容。在这里,my-bucket是存储桶名称,美国东部(俄亥俄)是Amazon地区,以及puppy.png是键名称。

https://my-bucket.s3.us-west-2.amazonaws.com/puppy.png

在参数化 S3 路径中,两个尖括号之间的任何字符 (<>)被视为正则表达式。以下是两个示例:

  • s3://my-databrew-bucket/databrew-input/invoice<.*>/data.json匹配所有名为的文件data.json,在的所有子文件夹中databrew-input谁的名字以invoice.

  • s3://my-databrew-bucket/databrew-input/<.*>2020<.*>/将文件夹中的所有文件2020在他们的名字里。

在这些例子中,.*匹配零个或多个字符。

注意

您只能在 S3 路径的关键部分(位于存储桶名称之后的部分)中使用正则表达式。因此,s3://my-databrew-bucket/<.*>-input/是有效的,但s3://my-<.*>-bucket/<.*>-input/不是。

我们建议您测试正则表达式,以确保它们只匹配您想要的 S3 URL,而不匹配您不想要的 S3 URL。

下面是正则表达式的其他几个示例:

  • <\d{2}>例如,匹配一个由两个连续数字组成的字符串07要么03,但不是1a2.

  • <[a-z]+.*>匹配以一个或多个小写拉丁字母开头且后面有零个或多个其他字符的字符串。例如,a3abc/def,或者a-z,但不是A2.

  • <[^/]+>匹配包含除斜杠之外的任何字符的字符串 (/)。在 S3 URL 中,斜杠用于分隔路径中的文件夹。

  • <.*=.*>例如,匹配包含等号 (=) 的字符串month=02abc/day=2,或者=10,但不是test.

  • <\d.*\d>匹配一个以数字开头和结尾的字符串,例如,这些数字之间可以包含任何其他字符,1abc201-02-03,或者2020/Jul/21,但不是123a.

使用自定义参数定义具有 S3 路径的数据集

当您可能想为 S3 位置提供参数时,使用自定义参数定义参数化数据集具有比使用正则表达式的优势:

  • 您可以获得与正则表达式相同的结果,而无需知道正则表达式的语法。您可以使用熟悉的术语来定义参数,例如 “开头为” 和 “包含”。

  • 使用路径中的参数定义动态数据集时,可以在定义中包括时间范围,例如 “过去一个月” 或 “过去 24 小时”。这样,您的数据集定义稍后将用于新的传入数据。

下面的例子告诉您何时可能要使用动态数据集:

  • 连接分区的多个文件上次更新日期或其他有意义的属性转换为单个数据集。然后,您可以将这些分区属性作为数据集中的其他列捕获。

  • 将数据集中的文件限制在满足特定条件的 S3 位置。例如,假设 S3 路径包含基于日期的文件夹,如folder/2021/04/01/. 在这种情况下,您可以对日期进行参数化并将其限制在特定范围内,例如 “2021 年 3 月 1 日至 2021 年 4 月 1 日之间” 或 “上周”。

要使用参数定义路径,请使用以下格式定义参数并将其添加到路径中:

s3://my-databrew-bucket/some-folder/{parameter1}/file-{parameter2}.json

注意

与 S3 路径中的正则表达式一样,您只能在路径的关键部分(位于存储桶名称之后的部分)中使用参数。

参数定义中需要两个字段:名称和类型。类型可以是字符串数字,或者日期. 类型的参数日期必须有日期格式的定义,以便 DataBrew 可以正确解释和比较日期值。或者,您可以定义参数的匹配条件。您还可以选择将参数的匹配值作为列添加到数据集中时,当数据集由 DataBrew 工作或互动会话。

示例

让我们考虑一个使用中的参数定义动态数据集的示例 DataBrew 控制台。在此示例中,假设输入数据定期使用以下位置写入 S3 存储桶中:

  • s3://databrew-dynamic-datasets/new-cases/UR/daily-report-2021-03-30.csv

  • s3://databrew-dynamic-datasets/new-cases/UR/daily-report-2021-03-31.csv

  • s3://databrew-dynamic-datasets/new-cases/US/daily-report-2021-03-30.csv

  • s3://databrew-dynamic-datasets/new-cases/US/daily-report-2021-03-31.csv

这里有两个动态部分:像美国这样的国家代码和文件名中的日期,如 2021-03-30。在此处,您可以对所有文件应用相同的清理方法。假设你想每天执行清理工作。以下是如何为此场景定义参数化路径:

  1. 导航到特定文件。

  2. 然后选择一个不同的部分,例如日期,然后用参数替换它。在这种情况下,请替换一个日期。

  3. 打开的上下文(右键单击)菜单创建自定义参数并为其设置属性:

    • 名称:报告日期

    • 类型: 日期

    • 日期格式:yyy-MM-DD(从预定义的格式中选择)

    • 条件(时间范围):过去 24 小时

    • 添加为列:true(选中)

    将其他字段保留为默认值。

  4. 选择 Create(创建)。

完成后,您将看到更新的路径,如以下屏幕截图所示。

现在你可以对国家/地区代码执行同样的操作并按如下方式对其进行参数化:

  • 名称:国家代码

  • 类型: 字符串

  • 添加为列:true(选中)

如果所有值都相关,则无需指定条件。在new-cases例如,我们只有带有国家/地区代码的子文件夹,因此不需要任何条件。如果您有其他文件夹要排除,您可以使用以下条件。

这种方法将新案例的子文件夹限制为包含两个大写拉丁字符。

在此参数化之后,您只能在我们的数据集中拥有匹配的文件,可以选择创建数据集.

注意

在条件下使用相对时间范围时,将在加载数据集时对时间范围进行评估。无论它们是预定义的时间范围(如 “过去 24 小时”)还是像 “5 天前” 这样的自定义时间范围,都是如此。无论是在交互式会话初始化期间还是在作业启动期间加载数据集,此评估方法都适用。

选择之后创建数据集您的动态数据集已准备就绪,可供使用。例如,您可以首先使用它来创建项目并使用交互式定义清理配方 DataBrew 会话。然后你可以创建一个计划每天运行的作业。此作业可能会将清理方法应用于作业启动时满足参数条件的数据集文件。

动态数据集的支持条件

您可以使用条件使用参数或上次修改的日期属性筛选匹配的 S3 文件。

下文中,您可以找到每种参数类型的支持条件的列表。

用于字符串参数的条件
名字在 DataBrew 开发工具包 SDK 同义词 名字在 DataBrew 控制台 描述

EQ,==

恰好是

参数的值与条件中提供的值相同。

不是

不是 EQ,! =

Is not

参数的值与条件中提供的值不同。

包含

Contains

参数的字符串值包含条件中提供的值。

不包含

不包含

参数的字符串值不包含条件中提供的值。

starts_WITH

从 开始

参数的字符串值以条件中提供的值开头。

不是 starts_WITH

不是从开始

参数的字符串值不以条件中提供的值开头。

ends_WITH

Ends with

参数的字符串值以条件中提供的值结束。

不是 ends_WITH

不是以结束

参数的字符串值不以条件中提供的值结束。

匹配

匹配项

参数的值与条件中提供的正则表达式匹配。

不匹配

不匹配

参数的值与条件中提供的正则表达式不匹配。

注意

String 参数的所有条件使用区分大小写的比较。如果您不确定 S3 路径中使用的案例,则可以将 “匹配” 条件与以开头的正则表达式值结合使用(?i). 这样做将导致不区分大小写的比较。

例如,假设您希望您的字符串参数以开始。abc,但是Abc要么ABC也是可能的。在这种情况下,你可以使用 “匹配” 条件(?i)^abc作为条件值。

用于编号参数的条件
名字在 DataBrew 开发工具包 SDK 同义词 名字在 DataBrew 控制台 描述

EQ,==

恰好是

参数的值与条件中提供的值相同。

不是

不是 EQ,! =

Is not

参数的值与条件中提供的值不同。

less_an

lt, <

小于

参数的数值小于条件中提供的值。

less_than_equal

LTE、<=

小于或等于

参数的数值小于或等于条件中提供的值。

“大于”

> >

大于

参数的数值大于条件中提供的值。

greer_than_equal

GTE,>=

大于或等于

参数的数值大于或等于条件中提供的值。

用于日期参数的条件
名字在 DataBrew 开发工具包 名字在 DataBrew 控制台 条件值格式 (SDK) 描述

之后

Start

ISO 8601 日期格式2021-03-30T01:00:00Z要么2021-03-30T01:00-07:00

date 参数的值晚于条件中提供的日期。

以前

End

ISO 8601 日期格式2021-03-30T01:00:00Z要么2021-03-30T01:00-07:00

date 参数的值早于条件中提供的日期。

亲戚 _ 之后

开始(相对)

正数或负数的时间单位,例如-48h要么+7d.

date 参数的值在条件中提供的相对日期之后。

在加载数据集时(交互式会话初始化或关联作业启动时)对相对日期进行评估。这是在示例中被称为 “现在” 的时刻。

亲戚 _ 之前

结束(相对)

正数或负数的时间单位,例如-48h要么+7d.

date 参数的值早于条件中提供的相对日期。

在加载数据集时(交互式会话初始化或关联作业启动时)对相对日期进行评估。这是在示例中被称为 “现在” 的时刻。

如果您使用 SDK,请按以下格式提供相对日期:±{number_of_time_units}{time_unit}. 你可以使用以下时间单位:

  • -1h(1 小时前)

  • +2d(从现在起 2 天)

  • -120m(120 分钟前)

  • 5000s(从现在起 5,000 秒)

  • -3w(3 周前)

  • +4M(从现在起 4 个月)

  • -1y(1 年前)

在加载数据集时(交互式会话初始化或关联作业启动时)对相对日期进行评估。在前面的例子中,这是被称为 “现在” 的时刻。

配置动态数据集的设置

除了提供参数化 S3 路径之外,您还可以为包含多个文件的数据集配置其他设置。这些设置按上次修改日期过滤 S3 文件并限制文件的数量。

与在路径中设置日期参数类似,您可以在更新匹配文件时定义时间范围,并将这些文件仅包含到数据集中。您可以使用 “2021 年 3 月 30 日” 等绝对日期或 “过去 24 小时” 等相对范围来定义这些范围。

要限制匹配文件的数量,请选择大于 0 的文件数以及您想要最新的还是最旧的匹配文件。