最近,当分区数量非常多时,我遇到了 AWS Athena 问题。
旧版本的数据库和表只有 1 个分区级别,比如 id=x。我们拿一张桌子;例如,我们存储每个 id(产品)的支付参数,并且没有很多 ID。假设它在 1000-5000 左右。现在,在查询该表时,在 where 子句上传递 id 号,例如“.. where id = 10”。实际上,查询返回的速度非常快。假设我们每天更新数据两次。
最近,我们一直在考虑为一天添加另一个分区级别,例如“../id=x/dt=yyyy-mm-dd/..”。这意味着如果一个月过去了,分区数每天增长 xID 倍,如果我们有 3000 个 ID,我们每月大约会得到 3000x30=90000 个分区。因此,分区数量迅速增长。
假设 3 个月前的数据(约 27 万个分区),我们希望看到如下查询最多在 20 秒左右返回。
select count(*) from db.table where id = x and dt = 'yyyy-mm-dd'
这需要一分钟。
真实案例
事实证明,Athena 首先获取所有分区(元数据)和 s3 路径(无论使用 where 子句),然后过滤您希望在 where 条件下查看的那些 s3 路径。第一部分(按分区获取所有 s3 路径的持续时间与分区数量成正比)
您拥有的分区越多,执行查询的速度就越慢。
直觉上,我希望 Athena 只获取 where 子句中规定的 s3 路径,我的意思是这将是分区的一种神奇方式。也许它获取所有路径
编辑
为了澄清上述声明,我从支持邮件中添加了一段。
来自支持
... 你提到你的新系统有 360000,这是一个很大的数字。因此,当您执行此操作时
select …
我正在尝试创建一个函数,该函数采用子集列表,如果所有组合都存在,则将它们合并为更大的集合。
基本上,假设我们有 n=4(即 index_domain = {0,1,2,3}),我们有以下组合作为输入
[(0, 2), (0, 3), (1, 3), (2, 3)]
Run Code Online (Sandbox Code Playgroud)
该函数应接受此输入并生成以下输出:
[(0, 2, 3), (1, 3)]
Run Code Online (Sandbox Code Playgroud)
因此, (0, 2, 3) 因为所有组合(2 的组合)都存在于输入列表中。(1, 3) 保持原样,因为我们没有 1 的另一个组合。
对于索引域 D ? ? 和输入列表L,案例的主要特点是:
简单地说,它是相反的组合(n,2)。我已经搜索了“反向组合”这个主题,到目前为止我还没有找到合适的资源。我已经考虑了一些选项,比如输入的双重迭代来检查是否所有组合都存在,但这不是最好的方法。我还没有想出一个有效的解决方案。欣赏任何有效解决方案的想法。
谢谢。
algorithm ×1
aws-glue ×1
combinations ×1
graph-theory ×1
nosql ×1
presto ×1
python ×1
python-3.x ×1