来自多个s3 bucket的库存列表usign athena

gajydyqb  于 2021-06-24  发布在  Hive
关注(0)|答案(1)|浏览(232)

我试着用雅典娜查询aws s3投资清单。如果我只有一个源bucket,我就可以这样做。我不知道如何配置它来处理多个源bucket。
我们使用所有默认配置选项,数据格式为csv。配置单元的s3清单目标存储桶名称模式如下:

destination-prefix/source-bucket/config-ID/hive/dt=YYYY-MM-DD-HH-MM/symlink.txt

因此,当我创建一个雅典娜表时,我必须使用静态配置单元路径。

CREATE EXTERNAL TABLE your_table_name(
  //column names
)
PARTITIONED BY (dt string)
//options ignored
LOCATION 's3://destination-prefix/source-bucket/config-ID/hive/';

因此,如果我想查询多个源bucket的库存数据,似乎必须为每个“源bucket”创建一个表。
或者,不使用雅典娜,我尝试用aws cli来实现这一点

aws s3 ls s3://our-bucket-name/prefix/abc --recursive | awk ‘$1 > “2019-04-01”

但这会首先获取每个文件,因为没有选项可以用“s3ls”设置--include或--exclude
最后,问题是:
我是否可以配置aws inventory为多个s3 bucket生成inventory,使其将所有内容放入同一个“hive”目录(即在生成invetory时忽略“source bucket”前缀)?
是否可以配置雅典娜从多个Hive位置读取?但随着新的桶被创建和丢弃的可能性,我猜这会变得丑陋。
有没有其他方法可以代替athena或aws cli来查询库存列表,或者编写自定义代码来使用manifest.json文件来获取这些csv文件。

7rfyedvj

7rfyedvj1#

很遗憾,您不能让s3清单为多个存储桶创建一个清单。但是,您可以将库存拼接到一个表中。
你链接到的向导说要跑 MSCK REPAIR TABLE … 装载你的库存。我建议您不要这样做,因为这样会创建奇怪的表,其中每个分区都表示某个时间点的库存,如果您想每天或每周比较存储桶中的内容,这可能是您想要的,但可能不是您大多数时候想要的。大多数时候你想知道现在桶里有什么。要将多个清单放入同一个表中,也不应运行该命令。
首先,稍微更改创建表的方式:

CREATE EXTERNAL TABLE your_table_name(
  //column names
)
PARTITIONED BY (bucket_name string)
//options ignored
LOCATION 's3://destination-prefix/source-bucket/config-ID/hive/';

注意,我将分区从 dt stringbucket_name string .
接下来手动添加分区:

ALTER TABLE your_table_name
ADD PARTITION (bucket_name = 'some-bucket') LOCATION 's3://destination-prefix/source-bucket/config-ID1/hive/dt=YYYY-MM-DD/'
ADD PARTITION (bucket_name = 'another-bucket') LOCATION 's3://destination-prefix/source-bucket/config-ID2/hive/dt=YYYY-MM-DD/';

位置应该是每个bucket的inventory的“hive”前缀下最新日期的s3uri。
这样做的缺点是,在交付新库存时,需要更新表以指向这些新位置。您可以先删除分区:

ALTER TABLE your_table_name
DROP PARTITION (bucket_name = 'some-bucket')
DROP PARTITION (bucket_name = 'another-bucket');

然后再次使用与上面相同的sql添加它们,但是使用新的s3uri。

相关问题