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 fields
FROM table
WHERE type='A'
AND year='2020'
AND month='11'
AND day='25'
AND hour='20'
但每个类型
- 拼花地板-完成
- 尽可能少的列-完成(我有很多,但是我需要的最小值)
- 使用更少的拼花文件,每个大约64mb。我有168个文件,只有很少的
,然后试图将它们合并到一个大约1MB的文件中kb
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是一个数字您的数据是否划分到不同的路径中?例如,所有
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。然后,使用年分区和频谱定义外部表,可以减少需要扫描的对象数量。