AWS Athena 如何分区数据并且必须是 Hive 格式?

How AWS Athena partition data and must be in Hive format?

我的情况是:

我有很多 csv 文件上传到 S3 中,并在 Athena 中定义了一组外部表以访问 S3 Bucket 下的相应文件夹。随着数据量的增加,我的老板想对数据进行分区以节省资金并提高性能。

我的问题是:

  1. 根据文档,分区数据将采用 Hive 格式。那么我所有的 csv 文件都将更改为 Hive 格式吗?

  2. S3的总数据量会随着csv和hive格式文件的存储而增加吗?

  3. 在不需要更改文件格式(csv 到 hive)的情况下,分区只是意味着根据特定的 csv 列将数据放在不同的子文件夹或子数据库中?但是如果是这样的话,当我根据不相关的2个csv列设置2个分区时,数据会因为分区而重复吗?

  4. AWS 新手,不知道 Athena 是如何进行分区的。非常感谢详细的解释。

按顺序回答您的问题:

  1. 您可以根据需要对数据进行分区,并保留 csv 文件格式。 Athena leverages hive for partitioning, but partitioning in and of itself does not change the data type. (You could use AWS Glue 以设置工作流以在 Parquet、CSV 和其他支持的格式之间转换数据。)您可以使用 gzip(或其他支持的压缩算法)压缩 csv 文件,以实现减少扫描大小和提高性能的目标。

  2. 因为您没有存储数据的多个副本(除非您愿意)。存储不会增加。 (您可以使用 Amazon Glacier 归档非分区数据)。

  3. 在 Athena 中考虑分区的更好方法是使用 "tags" 而不是使用 "folders." 随着您获得使用 S3 的经验并开始进行 API 调用或者使用 CLI,你会发现 S3 没有文件夹的概念(尽管控制台有一个按钮说创建文件夹)。

  4. 可以找到详细的解释here。考虑以下 csv 文件,cities.csv 1,New York,8500000 2,Boston,673184 3,Philadelphia,1568000 4,Baltimore,621849 5,Washington DC,681170

使用 AWK(或等效的 Powershell)我们可以将这个文件分成 5 个文件。

$ awk -F "," '{OFS=","; print ,>"cities_data_"".csv"}' cities.csv
$ ls
cities.csv  cities_data_1.csv  cities_data_2.csv  cities_data_3.csv  cities_data_4.csv  cities_data_5.csv

我们现在可以将这些文件上传到 S3 并用分区值标记它们(将它们放在分区标记的文件夹中)。

我们现在可以从控制台(或 CLI 或 API)运行 DDL:

CREATE EXTERNAL TABLE cities (
  name string,
  population int
) PARTITIONED BY (
  id_partitioned int
) ROW FORMAT DELIMITED
 FIELDS TERMINATED BY ','
 LINES TERMINATED BY '\n'
LOCATION 's3://<YOURBUCKETNAME>/';

然后加载分区:

MSCK REPAIR TABLE cities;

现在我们可以根据这些分区进行查询:

SELECT 
  name,
  population
FROM cities 
where id_partitioned = 1

您可以试验 where 子句并查看对扫描大小的影响。