Redshift Spectrum如何扫描数据?

5

给定一个1.4 TB的Parquet数据源,存储在S3上,按时间戳字段进行分区(因此分区为--),我正在通过Redshift Spectrum查询特定日期的数据(2.6 GB的数据),并检索Parquet文件中的所有可用字段,使用以下查询:

SELECT *
FROM my_external_schema.my_external_table
WHERE year = '2020' and month = '01' and day = '01'

这张表格是通过一个指向S3顶级“文件夹”的Glue Crawler提供的;这将创建一个数据库,然后通过此命令将数据库链接到新的外部架构

create external schema my_external_schema from data catalog
database 'my_external_schema'
iam_role 'arn:aws:iam::123456789:role/my_role'
region 'my-region-9';

通过我的IDE分析表格,我可以看到该表格是由以下语句生成的:

create external table my_external_schema.my_external_table
    (
    id string,
    my_value string,
    my_nice_value string
    )
partitioned by (year string, month string, day string)
row format serde 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
with serdeproperties ('serialization.format'='1')
stored as
inputformat 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
outputformat 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
location 's3://my-bucket/my/location/'
table properties ('CrawlerSchemaDeserializerVersion'='1.0', 'CrawlerSchemaSerializerVersion'='1.0', 'UPDATED_BY_CRAWLER'='my_crawler');

当我分析Redshift查询时,我发现它扫描了大约86GB的数据。
这怎么可能呢?这是一个问题,因为Redshift根据扫描的数据量计费,看起来该服务正在扫描该分区中实际数据量的约40倍。
我还尝试在Athena中执行相同的查询,那里只扫描了2.55GB的数据(明显更合理)。
我不能提供太多有关集群大小的细节,但可以假设这86GB的扫描数据可以适应集群的内存。

1
数据的总大小是多少(未分区)?您确定数据以正确的方式进行了分区吗?能否向我们展示您的“CREATE EXTERNAL TABLE”命令以及用于数据的路径名称示例? - John Rotenstein
嘿@JohnRotenstein,我更新了问题,试图回答你所有的疑问。这是否给你提供了你所要求的所有信息?还有其他疑问吗?无论如何感谢你的关注;) - Vzzarr
你能否在 Athena 中运行相同的查询,以比较扫描了多少数据?如果您能展示创建表语句,那就更好了。 - Philipp Johannis
嗨@PhilippJohannis,正如我在问题中所写的那样,表是由Glue爬虫自动创建的。您还有什么需要了解的吗? - Vzzarr
@PhilippJohannis 我明白你的意思... 我通过我的IDE检索了信息并在问题中报告了这些信息。我也会尝试在Athena中进行同样的查询... - Vzzarr
显示剩余3条评论
1个回答

5
问题似乎出现在AWS Redshift控制台中。
如果我们分析Redshift控制台中“查询详细信息”中的查询,我可以看到“扫描的总数据”报告了86GB。正如Vzarr所提到的,我在Athena上运行了相同的查询以比较性能。执行时间基本相同,但扫描的数据量完全不同:2.55GB。
我对S3外部模式中的其他查询进行了相同的比较,有使用分区列和没有使用分区列的情况:我发现每个测试中扫描的GB总数都不同,有时差别很大(在Redshift Spectrum中为320MB,在Athena中为20GB)。
我决定查看Redshift中的系统表,以了解外部模式上的查询是如何工作的。我使用SVL_S3QUERY进行了一个非常简单的测试:
SELECT (cast(s3_scanned_bytes as double precision) / 1024 / 1024 / 1024) as gb_scanned,
       s3_scanned_rows,
       query
FROM SVL_S3QUERY
WHERE query = '<my-query-id>'

查询结果与AWS Redshift控制台所显示的完全不同。不仅gb_scanned是错误的,s3_scanned_rows也是错误的。查询返回了总共2.55GB的扫描数据,与Athena所说的完全相同。
为了确认SVL_S3QUERY中的数字,我使用 AWS Cost Explorer来检查一天内扫描的总量以及我们为Redshift Spectrum支付的费用:这些数字基本相同。
此时,我不知道AWS Redshift控制台从何处或哪个表格中获取查询详细信息,但它们似乎完全错误。

3
我可以确认这是一个“已知的错误”,并将由亚马逊 Redshift 开发团队解决。感谢您提供详细的深入细节! - John Rotenstein
这个问题被AWS解决了吗?我认为应该是的,因为已经过去一年了,但还想确认一下。 - Gabe
你的假设是错误的 :(。Redshift控制台和恢复表仍然提供不同的结果。 - Hyruma92
最后,我觉得自己要疯了!我也遇到了类似的问题,所以我现在可以确认这个 bug 今天仍然存在!@Hyruma92,你提到在与 AWS Cost Explorer 进行核对之后,“数字基本相同”。你是指成本与 SVL_S3QUERY 或 Redshift 控制台的数字相符吗? - sasawatc
使用SVL_S3QUERY,非常烦人的是问题仍然存在。 - Hyruma92

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接