首页 > 解决方案 > AWS 雅典娜 | CSV 与实木复合地板 | 扫描数据的大小

问题描述

TLDR : Athena: select top 10parquet 格式比 csv 格式扫描更多数据。不应该反过来吗?

我正在使用 Athena(V1) 来查询以下两个数据集(相同的数据但两种不同的文件格式):

格式 尺寸 雅典娜数据库名称 雅典娜表名 数据集描述
CSV 91.3 MB 纽约市出租车 数据 纽约市出租车旅行,出现在公共 s3 存储桶中
镶木地板 19.4 MB 纽约市出租车 aws_glue_result_xxxx 与上述相同的数据转换为镶木地板 - 通过 Glue Crawler 作业 - 并存储在我的一个 S3 存储桶中

现在我在两个表上执行以下查询:

select lpep_pickup_datetime, lpep_dropoff_datetime 
from nycitytaxi.<table_name>
limit 10

在基于 csv 的表(table_name: data)上执行此查询时,Athena 控制台显示它扫描了 721.96 KB的数据。

在基于 parquet 的表(table_name : aws_glue_result_xxxx)上执行此查询时,Athena 控制台显示它扫描了 10.9 MB的数据。

Athena 不应该为基于 parquet 的表扫描更少的数据,因为 parquet 是基于列的,而不是基于行的 CSV 存储?

标签: amazon-web-servicescsvparquetamazon-athena

解决方案


这是由于您的特定查询。

select lpep_pickup_datetime, lpep_dropoff_datetime 
from nycitytaxi.<table_name>
limit 10

在 CSV 等基于行的格式中,所有数据都按行存储。这意味着只要你说,选择任何 10 行,它就可以从头开始读取 csv 文件并选择前 10 行,导致数据扫描非常低。

在 parquet 等列式数据格式中,记录按列存储。让我们假设数据有三列,比如id, name, number。这意味着,所有的id值将被存储在一起,所有的name值将被存储在一起,所有的number值将被存储在一起。因此,当您运行查询时,在 parquet 中选择 10 行,我将不得不扫描每列中存在于不同存储位置的 10 个值。这意味着我将不得不扫描更多。

更多关于镶木地板的利弊在这里


推荐阅读