[英]How AWS Athena partition data and must be in Hive format?
我的情況是:
我有許多csv文件上傳到S3中,並且在Athena中定義了一組外部表來訪問S3 Bucket下的相應文件夾。 隨着數據量的增加,我的老板想對數據進行分區,以節省資金並提高性能。
我的問題是:
根據文檔,分區數據將為Hive格式。 因此,我所有的csv文件都會更改為Hive格式嗎?
當同時存儲csv和hive格式文件時,S3處的總數據量會增加嗎?
無需更改文件格式(從csv到hive),分區僅意味着根據特定的csv列將數據放置在不同的子文件夾或子db中? 但是如果是這種情況,當我基於2個不相關的csv列設置2個分區時,由於分區,數據將重復嗎?
AWS的新手,不知道如何在Athena進行分區。 高度贊賞詳細的解釋。
要按順序回答您的問題:
您可以根據需要對數據進行分區,並保持csv文件格式。 雅典娜利用蜂巢進行分區 ,但是分區本身不會更改數據類型。 (您可以使用AWS Glue設置工作流,以在Parquet,CSV和其他受支持的格式之間轉換數據。)您可以使用gzip(或其他受支持的壓縮算法)壓縮csv文件,以達到減少掃描尺寸和提高性能的目標。
由於您沒有存儲數據的多個副本(除非您願意)。 存儲不會增加。 (您可以使用Amazon Glacier歸檔未分區的數據)。
在Athena中考慮分區的一種更好的方法是使用“標簽”,而不是使用“文件夾”。 當您獲得使用S3並開始進行API調用或使用CLI的經驗時 ,您會發現S3沒有文件夾的概念(盡管控制台上有一個表示創建文件夾的按鈕)。
在這里可以找到詳細的解釋。 考慮以下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子句,並查看對掃描大小的影響。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.