【发布时间】:2023-04-10 03:38:01
【问题描述】:
我想知道 Athena 分区投影如何处理包含具有不同字段的 CSV 文件的文件夹。假设我的存储桶按年、月和日划分为 s3://SalesPurchases/{year}/{month}/{day}。在每 15 分钟的时间间隔内,我生成两个文件,描述在该时间间隔内进行的销售和购买。例如,文件名将是 Sales-15min-03:00.csv,表示它是在凌晨 3 点生成的,并保存了前 15 分钟的更新。这些文件包含以下字段:
Sales: id, description, amount - (all strings)
Purchases: id, description, vendor, amount - (all strings)
如果我为销售创建一个表:
CREATE EXTERNAL TABLE sales_data (
id string,
description string,
amount string
)
PARTITIONED BY (
`year` string,
`month` string,
`day` string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
LOCATION 's3://SalesPurchases/'
TBLPROPERTIES (
"skip.header.line.count" = "1",
"projection.enabled" = "true",
"projection.year.type" = "integer",
"projection.year.range" = "2020,2021",
"projection.month.type" = "integer",
"projection.month.range" = "01,12",
"projection.day.type" = "integer",
"projection.day.range" = "01,31",
"storage.location.template" = "s3://SalesPurchases/${year}/${month}/${day}"
)
我只是想知道这种方法的效率。此 CREATE 语句中没有指示仅过滤“销售”文件。当实际查询 year=2020,month=01,day=01 的数据时,我相信该分区中的所有 Sales 和 Purchases 文件都会被读取。我开始相信这与通过胶水爬虫创建数据目录条目的方式没有什么不同。它们都将定义相同的模式信息。但是我确实相信分区投影在某种程度上更优化。
由于 Sales 中的所有字段都是 Purchases 中字段的子集,因此我也有兴趣了解如何处理。
我注意到的另一个奇怪之处是,当我使用上面的 create table 语句时,当需要查询时,我会执行类似的操作
select * from sales_data limit 10
select count(*) from sales_data
我得到零结果。我必须在查询中专门包含更多过滤器以获取有意义的信息,例如
select * from sales_data where year = '2020' and month = '01' and day = '01' limit 10
分区投影是不是很奇怪?然而,当使用爬虫生成架构信息时,情况并非如此。在这种情况下,select * from sales_data limit 10 将返回非零结果。这是为什么呢?
谢谢。
【问题讨论】:
标签: amazon-athena