连接 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文件扩展名都相同。在控制台上,您可以将源 URL 指定为s3://my-databrew-bucket/databrew-input/。然后,您可以在 DataBrew 控制台上选择此文件夹。您的数据集由该文件夹中的所有 JSON 文件组成。

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

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

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

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

使用多个文件作为数据集时的架构

使用多个文件作为 DataBrew 数据集时,所有文件的架构必须相同。否则,项目工作区会自动尝试从多个文件中选择一个架构,并尝试使其余的数据集文件符合该架构。这种行为会导致在 Project Workspace 期间显示的视图不规则,因此,作业输出也将是不规则的。

如果您的文件必须具有不同的架构,则需要创建多个数据集并分别对其进行分析。

使用适用于 Amazon S3 的参数化路径

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

DataBrew 通过参数化的 S3 路径支持这种方法。参数化路径是包含正则表达式或自定义路径参数(或两者兼而有之)的 Amazon S3 网址。

使用正则表达式定义带有 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 网址,而不匹配您不想要的 S3 网址。

以下是其他一些正则表达式的示例:

  • <\d{2}>匹配恰好由两个连续数字组成的字符串,例如0703,但不是1a2

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

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

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

  • <\d.*\d>匹配以数字开头和结尾且数字之间可以包含任何其他字符的字符串,例如1abc201-02-032020/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. 打开 “创建自定义参数” 的上下文(右键单击)菜单并为其设置属性:

    • 名称:报告日期

    • 类型:日期

    • 日期格式:yyyy-mm-dd(从预定义的格式中选择)

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

    • 添加为列:true(已选中)

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

  4. 选择 创建

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

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

  • 名称:国家/地区代码

  • 类型:字符串

  • 添加为列:true(已选中)

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

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

完成此参数化后,您的数据集中只有匹配的文件,可以选择 “创建数据集”。

注意

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

选择 “创建数据集” 后,您的动态数据集就可以使用了。例如,您可以先使用它来创建项目,然后使用交互式 DataBrew 会话定义清理方案。然后,您可以创建一个计划每天运行的作业。此作业可能会将清理方法应用于作业开始时满足参数条件的数据集文件。

动态数据集支持的条件

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

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

与字符串参数一起使用的条件
DataBrew SDK 中的名称 SDK 同义 DataBrew 控制台中的名称 描述

eq,==

正是

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

不是

不是 eq,! =

Is not

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

contains

包含

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

不包含

不包含

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

开头_with

开始于

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

不是以 _with 开头

开头不是

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

结束_with

结束于

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

不结尾_with

结尾不是

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

匹配

匹配项

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

不匹配

不匹配

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

注意

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

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

与数字参数一起使用的条件
DataBrew SDK 中的名称 SDK 同义 DataBrew 控制台中的名称 描述

eq,==

正是

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

不是

不是 eq,! =

Is not

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

小于

lt,<

Less than

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

小于等于

lte,<=

小于或等于

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

大于

gt,>

Greater than

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

大于等于

gete,>=

大于或等于

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

与日期参数一起使用的条件
DataBrew SDK 中的名称 DataBrew 控制台中的名称 条件值格式 (SDK) 描述

之后

启动

ISO 8601 日期格式,比如或 2021-03-30T01:00:00Z 2021-03-30T01:00-07:00

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

以前

结束

ISO 8601 日期格式,比如或 2021-03-30T01:00:00Z 2021-03-30T01:00-07:00

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

relative_aft

开始(相对)

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

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

相对日期是在数据集加载时计算的,无论是在初始化交互式会话时,还是在启动关联作业时。在示例中,这就是所谓的 “现在” 的时刻。

相对之前

结束(相对)

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

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

相对日期是在数据集加载时计算的,无论是在初始化交互式会话时,还是在启动关联作业时。在示例中,这就是所谓的 “现在” 的时刻。

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

  • -1h(1 小时前)

  • +2d(2 天后)

  • -120 米(120 分钟前)

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

  • -3w(3 周前)

  • +400 万(4 个月后)

  • -1年(1 年前)

相对日期是在数据集加载时计算的,无论是在初始化交互式会话时,还是在启动关联作业时。在前面的例子中,这个时刻被称为 “现在”。

配置动态数据集的设置

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

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

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