我的理由是:
我有很多csv文件上传到S3并且在Athena中定义了一组外部表来访问S3 Bucket下的相应文件夹。随着数据量的增加,我的老板想要对数据进行分区,以节省资金并提高性能。
我的问题是:
根据文档,分区数据将采用Hive格式。那么我的所有csv文件都会变成Hive格式吗?
S3的总数据量会随着csv和hive格式文件的存储而增加吗?
在不需要文件格式更改(csv到hive)的情况下,分区只是意味着根据特定的csv列将数据放在不同的子文件夹或子db中?但是如果是这种情况,当我根据2个csv列设置2个分区时,这两个分区是不相关的,由于分区,数据会重复吗?
AWS的新手,不知道如何在Athena进行分区。详细解释非常感谢。
答案 0 :(得分:2)
按顺序回答您的问题:
您可以根据需要对数据进行分区并保留csv文件格式。 Athena leverages hive for partitioning,但分区本身并不会改变数据类型。 (您可以使用AWS Glue设置工作流以在Parquet,CSV和其他支持的格式之间转换数据。)您可以使用gzip(或其他支持的压缩算法)压缩csv文件,以满足减少扫描尺寸的目标并提高绩效。
因为您没有存储多个数据副本(除非您愿意)。存储不会增加。 (您可以使用Amazon Glacier)归档未分区的数据。
在Athena中考虑分区的更好方法是使用“标签”而不是使用“文件夹”。当您获得使用S3并开始进行API调用或使用CLI的经验时,您会发现S3没有文件夹的概念(尽管控制台有一个显示创建文件夹的按钮)。
可以找到详细解释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 $2,$3>"cities_data_"$1".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子句并查看对扫描尺寸的影响。