【问题标题】:AWS Athena query on parquet file - using columns in where clauseAWS Athena 查询镶木地板文件 - 使用 where 子句中的列
【发布时间】:2020-11-02 08:12:18
【问题描述】:

我们计划在 S3 中使用 Athena 作为我们数据(存储为分区中的 parquet 文件)的后端服务。

我们感兴趣的一些事情是在查询的 where 子句中添加额外的列如何影响查询运行时间。 例如,我们在一个 hive 分区中有 1000 万条记录(基于列 'date' 的分区)

下面的所有查询都返回相同的数量 - 1000 万。当我们在 where 子句中添加额外的列(因为 parquet 是柱状 fomar)时,所有这些查询会花费相同的时间还是会减少查询运行? 我尝试对此进行测试,但结果并不一致,因为我猜还有一些排队时间

  1. select * from table where date='20200712'
  2. select * from table where date='20200712' and type='XXX'
  3. select * from table where date='20200712' and type='XXX' and subtype='YYY'

【问题讨论】:

  • “下面的所有查询都返回相同的数量 – 1000 万”是什么意思?听起来您是在说所有三个查询都将返回分区中的所有行,在这种情况下,我不明白 typesubtype 过滤器的用途是什么?我想我在这里误解了你,你能澄清一下吗?
  • 并非所有时间过滤器都可以减少计数,对吧?假设我不知道查询时,日期为 20200712 的所有记录的类型为 XXX,子类型为 YYY。我有兴趣查找其他过滤器是否有任何影响,如果它们不减少减少的记录数量..对于镶木地板文件的配置单元查询,因为镶木地板是基于列的格式

标签: amazon-web-services hive parquet amazon-athena


【解决方案1】:

Parquet 文件包含页面“索引”(最小值、最大值和布隆过滤器)。如果您在插入过程中按相关列对数据进行排序,例如:

insert overwrite table mytable partition (dt)
select col1, --some columns
       type, 
       subtype, 
       dt
 distribute by dt
       sort by type, subtype

那么这些索引可能会有效地工作,因为具有相同类型的数据,子类型将被加载到相同的页面中,将使用索引选择数据页面。在此处查看一些基准:https://blog.cloudera.com/speeding-up-select-queries-with-parquet-page-indexes/

开启谓词下推:https://docs.cloudera.com/documentation/enterprise/6/6.3/topics/cdh_ig_predicate_pushdown_parquet.html

【讨论】:

  • 谢谢..我们生成镶木地板的方式是使用现有 csv 文件中的 pandas..所以无法控制插入?
  • 我的问题基本上是在 where 子句中添加额外的列如何影响 hive 查询性能,尽管当文件为 parquet 格式时,返回的总记录与有或没有额外的列是相同的
  • @NareshK 如果数据未排序并且您选择所有列,您不会注意到任何差异。
  • 有不同的方法来生成 parquet..在 AWS EMR 上使用 spark,或 AWS 胶水作业或 pandas..哪一种是最好的..parquet 需要在 parquet 文件中有分区才能给出性能更好?
  • @NareshK 请提出另一个问题,不要在评论中,其他人可能会提供帮助
猜你喜欢
  • 2019-06-30
  • 2017-08-04
  • 2021-12-06
  • 2021-05-26
  • 2019-10-02
  • 2019-12-22
  • 2019-12-07
  • 1970-01-01
  • 2023-01-12
相关资源
最近更新 更多