【发布时间】:2020-12-10 17:43:48
【问题描述】:
我有一个airflow dag,它读取一些json 数据并拆分为不同的parquet 文件,这些文件上传到AWS S3。
我有由 5 个值划分的特定路径:
- 类型
- 年
- 月
- 天
- 小时
然后我做一个SELECT语句,例如:
SELECT fields
FROM table
WHERE type='A'
AND year='2020'
AND month='11'
AND day='25'
AND hour='20'
但每个 type S3 路径大约需要 2 分钟,我有 30 个并且还在增长。
我读到要加快速度,您必须使用以下内容:
- 镶木地板 - 完成
- 尽可能少的列 - 完成(我有很多,但这是我需要的最低限度)
- 使用更少的 parquet 文件,每个文件大约 64mb。在尝试将它们合并成一个大约 1 mb 的文件之前,我有 168 个文件,很少有
kb。
最后一个选项并没有加快速度。所以我不知道如何提高处理速度。这是一个每小时的工作,将 30 个文件夹数据插入到Redshift 表中需要 50 分钟。
数据已经是partitioned by:
如果我使用:
select *
from SVV_EXTERNAL_PARTITIONS
where tablename='table' and schemaname='spectrum'
and values='["A","2020","11","25","20"]';
返回一行:
spectrum,table,"[""A"",""2020"",""11"",""25"",""20""]",s3://parquet/account/A/2020/11/25/20/,org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat,org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat,org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe,{},0,{}
【问题讨论】:
-
您的数据是否已分区到单独的路径中?例如,是否所有
2020数据都在单独的文件和文件夹中? -
@JohnRotenstein 是的,2020 年的数据按月、日和小时划分。并将完整路径添加到我在帖子中附加的 PARTITIONED BY 语句中。
-
那些目录名称看起来不像普通的 Hive 样式分区。这通常具有像
year=2020/month=11/day=25/这样的目录名称。您是否测试过分区是否正常工作?例如,如果您查询year=2030,它是否会因为该分区没有数据而立即返回?那些年/月/日字段真的是字符串,而不是数字吗?只是想帮助你弄清楚发生了什么。 -
@JohnRotenstein mmm 你说得对, where year=2030 也需要很多时间。大约再过 2 分钟...如果我在 AWS Glue 控制台中搜索表并转到分区,我会看到分区为 partition_0、partition_1 和 partition_2、partition_3。当我查询它们时,我使用的年、月和其他命名约定是为了更好地理解。
-
这里的问题是,partition_0 和其他看起来像普通 Hive 风格的分区吗?还是我必须重新格式化它们?如果是这种情况,只需要在 s3 的文件夹名称中添加 partition_name=?
标签: python amazon-web-services amazon-s3 amazon-redshift amazon-redshift-spectrum