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

时间:2018-01-17 02:28:03

标签: amazon-web-services amazon-athena

我的理由是:

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

我的问题是:

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

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

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

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

1 个答案:

答案 0 :(得分:2)

按顺序回答您的问题:

  1. 您可以根据需要对数据进行分区并保留csv文件格式。 Athena leverages hive for partitioning,但分区本身并不会改变数据类型。 (您可以使用AWS Glue设置工作流以在Parquet,CSV和其他支持的格式之间转换数据。)您可以使用gzip(或其他支持的压缩算法)压缩csv文件,以满足减少扫描尺寸的目标并提高绩效。

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

  3. 在Athena中考虑分区的更好方法是使用“标签”而不是使用“文件夹”。当您获得使用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

  5. 使用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并使用分区值标记它们(将它们放在由分区标记的文件夹中)。

    In this example, we place the file for the data for id 1 in an appropriately labelled "folder"

    我们现在可以从控制台(或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子句并查看对扫描尺寸的影响。