我使用AWS Glue创建元数据表。
Aws glue Crawler数据存储路径: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 crawler没有检测到分区?
答案 0 :(得分:1)
答案是:
在合并模式之前Aws粘合爬虫,首先找到模式的相似性索引。如果相似性指数超过70%,则合并否则会创建一个新表。
答案 1 :(得分:1)
需要抓取其下包含所有分区的父文件夹,否则抓取工具会将每个分区视为单独的表。例如,创建这样的
s3://bucket/table/part=1
s3://bucket/table/part=2
s3://bucket/table/part=3
然后抓取s3:// bucket / table /
答案 2 :(得分:1)
要强制Glue将多个架构合并在一起,请在创建搜寻器时确保选中此选项- 为每个S3路径创建一个架构。
Screenshot of crawler creation step, with this setting enabled
这里有详细的解释-直接引用AWS文档(reference)
默认情况下,搜寻器为存储在Amazon S3中的数据定义表时,会同时考虑数据兼容性和架构相似性。考虑的数据兼容性因素包括数据是否具有相同的格式(例如JSON),相同的压缩类型(例如GZIP),Amazon S3路径的结构以及其他数据属性。模式相似性是衡量单独的Amazon S3对象的模式相似程度的一种度量。
您可以将搜寻器配置为在可能的情况下将CompatibleSchemas合并为通用表定义。使用此选项,搜寻器仍会考虑数据兼容性,但在评估指定包含路径中的Amazon S3对象时,将忽略特定架构的相似性。
如果要在控制台上配置搜寻器,要合并架构,请选择搜寻器选项“为每个S3路径创建一个架构”。
答案 3 :(得分:0)
尝试使用s3://bucket-name/<table_name>/pt=<date_time>/file
之类的表格路径。
如果之后Crawler将每个分区视为单独的表,请尝试手动创建表并重新运行Crawler以带来分区。
答案 4 :(得分:0)
如果搜寻器正在创建多个表,则意味着驻留在不同分区中的文件具有不同的结构。请检查所有分区中的文件结构。
答案 5 :(得分:0)
我需要做两件事才能让 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 以外的其他东西,类似地提供上述参数应该很简单。