我正在使用 AWS Glue 创建元数据表。
AWS Glue 爬网程序数据存储路径:s3://bucket-name/
S3 中的存储桶结构类似于
├── bucket-name
│ ├── pt=2011-10-11-01
│ │ ├── file1
| | ├── file2
│ ├── pt=2011-10-11-02
│ │ ├── file1
│ ├── pt=2011-10-10-01
│ │ ├── file1
│ ├── pt=2011-10-11-10
│ │ ├── file1
为此 AWS 爬网程序创建 4 个表。
我的问题是为什么 aws 胶水爬虫无法检测到分区?
要强制 Glue 将多个架构合并在一起,请确保在创建爬网程序时选中此选项 -为每个 S3 路径创建一个架构。
启用此设置的爬网程序创建步骤的屏幕截图
以下是详细说明 - 直接引用,来自 AWS 文档(参考)
默认情况下,当爬网程序为 Amazon S3 中存储的数据定义表时,它会同时考虑数据兼容性和架构相似性。考虑的数据兼容性因素包括数据是否具有相同的格式(例如 JSON)、相同的压缩类型(例如 GZIP)、Amazon S3 路径的结构以及其他数据属性。架构相似性用于衡量各个 Amazon S3 对象的架构的相似程度。
如果可能,您可以将爬网程序配置为将兼容架构合并到公共表定义中。使用此选项时,爬网程序仍会考虑数据兼容性,但在评估指定包含路径中的 Amazon S3 对象时会忽略特定架构的相似性。
如果您在控制台上配置爬网程序,要合并架构,请选择爬网程序选项为每个 S3 路径创建单个架构。
需要爬网一个父文件夹,其下有所有分区,否则爬网程序会将每个分区视为一个单独的表。 所以例子,这样创建
s3://bucket/table/part=1
s3://bucket/table/part=2
s3://bucket/table/part=3
然后抓取 S3://bucket/table/
答案是:
在合并架构之前,先找到架构的相似性索引。如果相似性指数超过 70%,则合并,否则创建一个新表。
我需要做两件事来获取 AWS Glue 以避免创建无关的表。这是用 boto3 1.17.46 测试的。
首先,确保 S3 对象结构如下:
s3://mybucket/myprefix/mytable1/<nested_partition>/<name>.xyz
s3://mybucket/myprefix/mytable2/<nested_partition>/<name>.xyz
s3://mybucket/myprefix/mytable3/<nested_partition>/<name>.xyz
其次,如果使用 boto3,请使用以下参数创建爬虫:
targets = [{"Path": f"s3://mybucket/myprefix/mytable{i}/"} for i in (1, 2, 3)]
config = {"Version": 1.0, "Grouping": {"TableGroupingPolicy": "CombineCompatibleSchemas"}}
boto3.client("glue").create_crawler(Targets={"S3Targets": targets}, Configuration=json.dumps(config))
- 根据
Targets
,每个表的路径都作为列表提供给爬网程序。 - 根据
Configuration
,每个提供的路径下的所有文件都应合并到单个模式中。
如果使用 boto3 以外的其他东西,则应该直接提供上述参数。
尝试使用表路径,如s3://bucket-name/<table_name>/pt=<date_time>/file
. 如果在此之后爬网程序将每个分区视为单独的表,请尝试手动创建表并重新运行爬网程序以引入分区。