【问题标题】:Speed up AWS Redshift spectrum select加快 AWS Redshift 频谱选择
【发布时间】:2020-12-10 17:43:48
【问题描述】:

我有一个airflow dag,它读取一些json 数据并拆分为不同的parquet 文件,这些文件上传到AWS S3

我有由 5 个值划分的特定路径:

  1. 类型
  2. 小时

然后我做一个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


【解决方案1】:

我希望您需要在外部表定义中使用 PARTITION BY 选项。仅在其中包含关键字的 S3 密钥路径并不会告诉 Redshift Spectrum 每个文件夹中有哪些数据。因此 Redshift 必须读取所有文件以查找您想要的数据。您可能需要更改文件的键路径,以使其符合 S3 分区语法。

一个很好的例子是https://docs.aws.amazon.com/redshift/latest/dg/c-spectrum-external-tables.html中的“Example 2: Partitioning with a multiple partition key”

【讨论】:

  • 已经在使用中。我附加了我运行的查询以检查表中是否设置了 okei。
  • 您的对象命名不支持分区。您需要在密钥路径中包含 YEAR=2020 而不仅仅是 2020。然后使用 PARTITION of YEAR 定义外部表,Spectrum 可以减少需要扫描的对象数量。
【解决方案2】:

一组要做的事情。清单如下:

  1. 确保您使用的是配置单元分区。如某些答案中所述,不需要year=2020 格式。 Hive 分区仅使用 2020 年。如果您不使用 year=2020 命名分区,则其命名为 partition_n,其中 n 是一个数字。
  2. 检查某些分区的数据量。文件越少越好(镶木地板)。
  3. 在重要的存储桶中拆分数据。就我而言,我与 4 个提供商合作。并且他们每个人都预计会增加数据量,然后我做了 4 个桶,而不是第一个分区是提供者的桶。

【讨论】:

    猜你喜欢
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 2022-01-28
    • 1970-01-01
    相关资源
    最近更新 更多