amazon-web-services - AWS 雅典娜 | CSV 与实木复合地板 | 扫描数据的大小
问题描述
TLDR : Athena: select top 10
parquet 格式比 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 存储?
解决方案
这是由于您的特定查询。
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 个值。这意味着我将不得不扫描更多。
更多关于镶木地板的利弊在这里。
推荐阅读
- mongodb - MongoDB加入两个集合
- android - 在android Webview中按下后如何返回上一个任务而不是关闭应用程序?
- c# - 在理解接口继承方面需要帮助
- git - 为什么我们应该避免在已推送的分支上使用 rebase 命令?
- swift - 当我运行我的应用程序时,除了渐变背景外,什么都没有显示(文本字段、按钮...),我现在正在处理界面
- c# - 文件夹复制错误:C# 中的 System.UnauthorizedAccessException
- docker-compose - 如何在容器内获取 docker 容器的长主机名?
- loops - 使用 Liquid 将 +1 计数动态传递给 zendesk 中的票证字段
- javascript - 使用导出默认值检查来自另一个 JavaScript 模块的变量状态
- android - 在 React-native 中从同一 Sourcefile 创建具有不同图标和 SplashScreen 的多个 APK