Python 加速AWS红移光谱选择

Python 加速AWS红移光谱选择,python,amazon-web-services,amazon-s3,amazon-redshift,amazon-redshift-spectrum,Python,Amazon Web Services,Amazon S3,Amazon Redshift,Amazon Redshift Spectrum,我有一个avirflowdag,它读取一些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' 但每个类型

我有一个
avirflow
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'
    
    但每个
    类型
    路径大约需要2分钟,我有30分钟,而且还在增长

    我了解到,要加快速度,您必须使用以下方法:

    • 拼花地板-完成
    • 尽可能少的列-完成(我有很多,但是我需要的最小值)
    • 使用更少的拼花文件,每个大约64mb。我有168个文件,只有很少的
      kb
      ,然后试图将它们合并到一个大约1MB的文件中
    最后一个选项没有加快速度。因此,我不知道如何提高处理速度。这是一项每小时一次的工作,将30个文件夹的数据插入
    Redshift
    表格需要50分钟

    数据已被分区:

    如果我使用:

    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,{}
    

    我希望您需要在外部表定义中使用partitionby选项。仅仅让S3键路径中包含关键字并不能告诉红移光谱每个文件夹中都有哪些数据。因此,Redshift必须读取所有文件以查找所需的数据。您可能需要更改文件的键路径,以便它们符合S3分区语法


    这样做的一个很好的例子是《要做的事情集》中的“示例2:使用多分区键进行分区”。检查表如下:

  • 确保您正在使用配置单元分区。不需要一些回答中提到的
    year=2020
    格式。配置单元分区仅在2020年可用。如果不使用
    year=2020
    命名分区,则将其命名为
    partition\u n
    ,其中n是一个数字
  • 检查一些分区的数据卷。最好是用更少的锉刀,用更大的锉刀(拼花地板)
  • 将数据拆分到有效存储桶中。就我而言,我与4家供应商合作。它们中的每一个都应该在数据量上进行grom,然后我做了4个bucekts,而不是第一个分区是提供程序的bucekts

  • 您的数据是否划分到不同的路径中?例如,所有
    2020
    数据是否在单独的文件和文件夹中?@JohnRotenstein是的,2020数据按月、日和小时进行分割。完整路径被添加到PARTITIONED BY语句中,正如我在文章中所附的那样。这些目录名看起来不像普通的配置单元样式的分区。通常会有目录名,如
    year=2020/month=11/day=25/
    。您是否测试过分区是否正常工作?例如,如果查询
    year=2030
    ,它是否会立即返回,因为没有该分区的数据?那些年/月/日字段真的是字符串而不是数字吗?只是想帮你弄清楚发生了什么。@JohnRotenstein嗯,你用where year=2030也是对的,也需要很多时间。再过大约2分钟。。。如果我在AWS Glue控制台中搜索表并转到分区,我会看到分区为分区0、分区1和分区2、分区3。当我查询它们时,我使用的年、月和其他命名约定是为了更好地理解它们?还是我必须重新格式化它们?如果只是在s3中的文件夹名中添加分区_name=,那么它已经在使用了。我附加了我运行以检查分区是否在表中设置的查询。您的对象命名不支持分区。您需要在关键路径中设置YEAR=2020,而不仅仅是2020。然后,使用年分区和频谱定义外部表,可以减少需要扫描的对象数量。