对“ tinyint”柱的镶木地板支持

时间:2018-07-12 15:40:20

标签: amazon-web-services apache-spark-sql parquet amazon-athena presto

使用AWS Athena在S3上查询镶木地板数据时,我遇到了一个奇怪的问题。  基本上,我在S3上存储了一个镶木文件(大约38MB),其结构如下:

表名:test_table_tinyint

  • ntwk_id(int)
  • broadcast_date(字符串)
  • daypart_id(tinyint)

然后我运行以下查询: 从“ test_table_tinyint”中选择count(*),其中daypart_id = 5;

结果: 运行时间:2.7秒,扫描的数据:32MB

这很奇怪,因为它看起来实际上不是在使用镶木地板文件中的列索引,而是进行了全表扫描。

然后作为比较,我创建了另一个表,该表具有相同的数据但架构略有不同:

表名:test_table_int

  • ntwk_id(int)
  • broadcast_date(字符串)
  • daypart_id(int)

从“ test_table_int”中选择count(*),其中daypart_id = 5;

这次我得到了更好的结果:

运行时间:1.07秒,扫描的数据:326.49KB

我在使用Spark SQL的Spark中遇到了类似的问题,看起来实木复合地板文件中的TinyInt列会引起全表扫描。如果将文件转换为ORC格式,则AWS Athena和Spark SQL的'TinyInt'结果与'Int'相似

有什么想法吗?

谢谢

1 个答案:

答案 0 :(得分:2)

这是因为当daypart_id是TINYINT时,daypart_id = 5实际上是CAST(daypart_id AS INTEGER) = 5(强制类型从窄到宽)。

为防止强制发生和压下,您可以给5常量和显式类型:daypart_id = TINYINT '5'

注意:我几乎可以肯定,较新版本的Presto可以解决此问题,因此您无需更改查询。您可以轻松地在AWS上使用较新的Presto版本,而并非没有服务器。