使用AWS Athena在S3上查询镶木地板数据时,我遇到了一个奇怪的问题。 基本上,我在S3上存储了一个镶木文件(大约38MB),其结构如下:
表名:test_table_tinyint
然后我运行以下查询: 从“ test_table_tinyint”中选择count(*),其中daypart_id = 5;
结果: 运行时间:2.7秒,扫描的数据:32MB
这很奇怪,因为它看起来实际上不是在使用镶木地板文件中的列索引,而是进行了全表扫描。
然后作为比较,我创建了另一个表,该表具有相同的数据但架构略有不同:
表名:test_table_int
从“ test_table_int”中选择count(*),其中daypart_id = 5;
这次我得到了更好的结果:
运行时间:1.07秒,扫描的数据:326.49KB
我在使用Spark SQL的Spark中遇到了类似的问题,看起来实木复合地板文件中的TinyInt列会引起全表扫描。如果将文件转换为ORC格式,则AWS Athena和Spark SQL的'TinyInt'结果与'Int'相似
有什么想法吗?
谢谢
答案 0 :(得分:2)
这是因为当daypart_id
是TINYINT时,daypart_id = 5
实际上是CAST(daypart_id AS INTEGER) = 5
(强制类型从窄到宽)。
为防止强制发生和压下,您可以给5
常量和显式类型:daypart_id = TINYINT '5'
。
注意:我几乎可以肯定,较新版本的Presto可以解决此问题,因此您无需更改查询。您可以轻松地在AWS上使用较新的Presto版本,而并非没有服务器。