使用 Athena 的多个 S3 存储桶的库存列表

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\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,当我创建 Athena 表时,我必须使用静态配置单元路径。

\n\n
CREATE 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/\';\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,如果我想查询多个源存储桶的库存数据,似乎我必须为每个“源存储桶”创建一个表。

\n\n

或者,在不使用 Athena 的情况下,我尝试使用 AWS CLI 来执行此操作

\n\n
aws s3 ls s3://our-bucket-name/prefix/abc --recursive | awk \xe2\x80\x98$1 > \xe2\x80\x9c2019-04-01\xe2\x80\x9d\n
Run Code Online (Sandbox Code Playgroud)\n\n

但这首先获取每个文件,因为没有选项可以使用“S3 ls”设置 --include 或 --exclude

\n\n

最后,问题是:

\n\n
    \n
  1. 我可以配置 AWS Inventory 为多个 S3 存储桶生成清单,以便将所有内容放入同一个“hive”目录中(即在生成 Invetory 时忽略“source-bucket”前缀)吗?

  2. \n
  3. 是否可以配置 Athena 从多个配置单元位置读取?但由于有可能创建和删除新的存储桶,我想这会变得很难看。

  4. \n
  5. 是否有其他方法可以代替 Athena 或 AWS CLI 来查询库存列表,或者编写自定义代码来使用 manifest.json 文件来获取这些 csv 文件。

  6. \n
\n

The*_*heo 6

不幸的是,您无法让 S3 Inventory 为多个存储桶创建一个清单。不过,您可以将库存拼接到一张表中。

\n\n

您链接到的指南说运行MSCK REPAIR TABLE \xe2\x80\xa6以加载您的库存。我建议您不要这样做,因为它会创建带有分区的奇怪表,每个分区代表某个时间点的库存,如果您想每天比较存储桶中的内容,这可能是您想要的或一周又一周,但大多数时候可能不是您想要的。大多数时候您想知道桶里现在有什么。要将多个清单放入同一个表中,您也不应该运行该命令。

\n\n

首先,稍微更改一下创建表的方式:

\n\n
CREATE 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/\';\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,我将分区从 更改dt stringbucket_name string

\n\n

接下来手动添加分区:

\n\n
ALTER 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/\';\n
Run Code Online (Sandbox Code Playgroud)\n\n

这些位置应该是每个存储桶清单的“hive”前缀下的最新日期的 S3 URI。

\n\n

这样做的缺点是,当交付新库存时,您将需要更新表以指向这些新位置。您可以通过首先删除分区来完成此操作:

\n\n
ALTER TABLE your_table_name\nDROP PARTITION (bucket_name = \'some-bucket\')\nDROP PARTITION (bucket_name = \'another-bucket\');\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后使用与上面相同的 SQL 再次添加它们,但使用新的 S3 URI。

\n