use*_*744 3 hive amazon-s3 amazon-web-services amazon-athena
我正在尝试使用 Athena 查询 AWS S3库存列表。如果我只有一个源存储桶,我就可以执行此操作。我不确定如何配置它以与多个源存储桶一起使用。
\n\n我们使用所有默认配置选项,数据格式为 CSV。Hive 的 S3 Inventory 目标存储桶名称模式如下:
\n\n destination-prefix/source-bucket/config-ID/hive/dt=YYYY-MM-DD-HH-MM/symlink.txt\nRun Code Online (Sandbox Code Playgroud)\n\n因此,当我创建 Athena 表时,我必须使用静态配置单元路径。
\n\nCREATE EXTERNAL TABLE your_table_name(\n //column names\n)\nPARTITIONED BY (dt string)\n//options ignored\nLOCATION \'s3://destination-prefix/source-bucket/config-ID/hive/\';\nRun Code Online (Sandbox Code Playgroud)\n\n因此,如果我想查询多个源存储桶的库存数据,似乎我必须为每个“源存储桶”创建一个表。
\n\n或者,在不使用 Athena 的情况下,我尝试使用 AWS CLI 来执行此操作
\n\naws s3 ls s3://our-bucket-name/prefix/abc --recursive | awk \xe2\x80\x98$1 > \xe2\x80\x9c2019-04-01\xe2\x80\x9d\nRun Code Online (Sandbox Code Playgroud)\n\n但这首先获取每个文件,因为没有选项可以使用“S3 ls”设置 --include 或 --exclude
\n\n最后,问题是:
\n\n我可以配置 AWS Inventory 为多个 S3 存储桶生成清单,以便将所有内容放入同一个“hive”目录中(即在生成 Invetory 时忽略“source-bucket”前缀)吗?
是否可以配置 Athena 从多个配置单元位置读取?但由于有可能创建和删除新的存储桶,我想这会变得很难看。
是否有其他方法可以代替 Athena 或 AWS CLI 来查询库存列表,或者编写自定义代码来使用 manifest.json 文件来获取这些 csv 文件。
不幸的是,您无法让 S3 Inventory 为多个存储桶创建一个清单。不过,您可以将库存拼接到一张表中。
\n\n您链接到的指南说运行MSCK REPAIR TABLE \xe2\x80\xa6以加载您的库存。我建议您不要这样做,因为它会创建带有分区的奇怪表,每个分区代表某个时间点的库存,如果您想每天比较存储桶中的内容,这可能是您想要的或一周又一周,但大多数时候可能不是您想要的。大多数时候您想知道桶里现在有什么。要将多个清单放入同一个表中,您也不应该运行该命令。
首先,稍微更改一下创建表的方式:
\n\nCREATE EXTERNAL TABLE your_table_name(\n //column names\n)\nPARTITIONED BY (bucket_name string)\n//options ignored\nLOCATION \'s3://destination-prefix/source-bucket/config-ID/hive/\';\nRun Code Online (Sandbox Code Playgroud)\n\n请注意,我将分区从 更改dt string为bucket_name string。
接下来手动添加分区:
\n\nALTER TABLE your_table_name\nADD PARTITION (bucket_name = \'some-bucket\') LOCATION \'s3://destination-prefix/source-bucket/config-ID1/hive/dt=YYYY-MM-DD/\'\nADD PARTITION (bucket_name = \'another-bucket\') LOCATION \'s3://destination-prefix/source-bucket/config-ID2/hive/dt=YYYY-MM-DD/\';\nRun Code Online (Sandbox Code Playgroud)\n\n这些位置应该是每个存储桶清单的“hive”前缀下的最新日期的 S3 URI。
\n\n这样做的缺点是,当交付新库存时,您将需要更新表以指向这些新位置。您可以通过首先删除分区来完成此操作:
\n\nALTER TABLE your_table_name\nDROP PARTITION (bucket_name = \'some-bucket\')\nDROP PARTITION (bucket_name = \'another-bucket\');\nRun Code Online (Sandbox Code Playgroud)\n\n然后使用与上面相同的 SQL 再次添加它们,但使用新的 S3 URI。
\n| 归档时间: |
|
| 查看次数: |
3409 次 |
| 最近记录: |