Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
在 Amazon Athena 中运行 CTAS 查询时,如何调整文件的数量或大小?
当我在 Amazon Athena 中运行 CREATE TABLE AS SELECT (CTAS) 查询时,我想定义文件的数量或每个文件的数据量。
解决方案
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
您可以在 CTAS 查询中使用分桶来控制输出文件的数量。但是,创建的文件数量可能并不总是与指定的存储桶数量一致。分桶功能可以将相似数据分组在一起,但无法精确控制文件数量。
以下解决方法使用了 Global Historical Climatology Network Daily 公共数据集:s3://noaa-ghcn-pds/csv.gz/。有关详细信息,请参阅 Visualize over 200 years of global climate data using Amazon Athena and Amazon Quick Sight(使用 Amazon Athena 和 Amazon Quick Sight 可视化超过 200 年的全球气候数据)。
**注意:**在以下示例命令中,请将以下值替换为您的值:
**external_location:**您保存 CTAS 查询的 Amazon Simple Storage Service (Amazon S3) 位置。
**format:**您希望的输出格式,例如 ORC、PARQUET、AVRO、JSON 或 TEXTFILE。
**bucket_count:**您希望的存储桶数量。
**bucketed_by:**用于对数据进行哈希处理并将数据保存到存储桶的字段,例如 yearmonthday。
检查数据集
要验证文件数量和数据集大小,请运行以下 ls 命令:
aws s3 ls s3://noaa-ghcn-pds/csv.gz/ --summarize --recursive --human-readable
**注意:**请将 s3://noaa-ghcn-pds/csv.gz/ 替换为您的 s3 存储桶路径。
输出示例:
2019-11-30 01:58:05 3.3 KiB csv.gz/1763.csv.gz 2019-11-30 01:58:06 3.2 KiB csv.gz/1764.csv.gz 2019-11-30 01:58:06 3.3 KiB csv.gz/1765.csv.gz 2019-11-30 01:58:07 3.3 KiB csv.gz/1766.csv.gz ... 2019-11-30 02:05:43 199.7 MiB csv.gz/2016.csv.gz 2019-11-30 02:05:50 197.7 MiB csv.gz/2017.csv.gz 2019-11-30 02:05:54 197.0 MiB csv.gz/2018.csv.gz 2019-11-30 02:05:57 168.8 MiB csv.gz/2019.csv.gz Total Objects: 257 Total Size: 15.4 GiB
创建环境
完成以下步骤:
-
要创建表,请运行以下命令:
CREATE EXTERNAL TABLE historic_climate_gz( id string, yearmonthday int, element string, temperature int, m_flag string, q_flag string, s_flag string, obs_time int) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://noaa-ghcn-pds/csv.gz/' -
要测试该表,请运行以下命令:
SELECT * FROM historic_climate_gz LIMIT 10输出将显示数据集中的 10 行内容。
创建环境后,在运行 CTAS 查询时使用以下方法来修改数据集。
修改数据集中的文件数量
最佳做法是按基数较高且值分布均匀的列对数据进行分桶。有关详细信息,请参阅分桶优势。
完成以下步骤:
-
要将数据集转换为 20 个文件,请运行以下命令:
CREATE TABLE "historic_climate_gz_20_files" WITH ( external_location = 's3://awsexamplebucket/historic_climate_gz_20_files/', format = 'TEXTFILE', bucket_count=20, bucketed_by = ARRAY['yearmonthday'] ) AS SELECT * FROM historic_climate_gz**注意:**上述示例使用了 yearmonthday 字段。
-
要确认存储桶包含所需数量的文件,请运行以下 ls 命令:
aws s3 ls s3://awsexamplebucket/historic_climate_gz_20_files/ --summarize --recursive --human-readable输出示例:
Total Objects: 20 Total Size: 15.6 Gib
设置每个文件的大致大小
完成以下步骤:
-
确定为实现所需文件数量必须使用的存储桶数量。例如,要将 15.4 GB 的数据集拆分为 2 GB 大小的文件,必须有 8 个文件(15.4 / 2 = 7.7,向上取整为 8)。
-
要创建新的分桶表,请运行以下命令:
CREATE TABLE "historic_climate_gz_2GB_files" WITH ( external_location = 's3://awsexamplebucket/historic_climate_gz_2GB_file/', format = 'TEXTFILE', bucket_count=8, bucketed_by = ARRAY['yearmonthday']) AS SELECT * FROM historic_climate_gz -
要确认数据集包含所需数量的文件,请运行以下 ls 命令:
aws s3 ls s3://awsexamplebucket/historic_climate_gz_2GB_file/ --summarize --recursive --human-readable输出示例:
2019-09-03 10:59:20 1.7 GiB historic_climate_gz_2GB_file/20190903_085819_00005_bzbtg_bucket-00000.gz 2019-09-03 10:59:20 2.0 GiB historic_climate_gz_2GB_file/20190903_085819_00005_bzbtg_bucket-00001.gz 2019-09-03 10:59:20 2.0 GiB historic_climate_gz_2GB_file/20190903_085819_00005_bzbtg_bucket-00002.gz 2019-09-03 10:59:19 1.9 GiB historic_climate_gz_2GB_file/20190903_085819_00005_bzbtg_bucket-00003.gz 2019-09-03 10:59:17 1.7 GiB historic_climate_gz_2GB_file/20190903_085819_00005_bzbtg_bucket-00004.gz 2019-09-03 10:59:21 1.9 GiB historic_climate_gz_2GB_file/20190903_085819_00005_bzbtg_bucket-00005.gz 2019-09-03 10:59:18 1.9 GiB historic_climate_gz_2GB_file/20190903_085819_00005_bzbtg_bucket-00006.gz 2019-09-03 10:59:17 1.9 GiB historic_climate_gz_2GB_file/20190903_085819_00005_bzbtg_bucket-00007.gz Total Objects: 8 Total Size: 15.0 GiB
转换数据格式并设置大致文件大小
完成以下步骤:
-
要将数据转换为其他格式,请运行以下命令:
CREATE TABLE "historic_climate_parquet" WITH ( external_location = 's3://awsexamplebucket/historic_climate_parquet/', format = 'PARQUET') AS SELECT * FROM historic_climate_gz -
要确认数据集的大小,请运行以下 ls 命令:
aws s3 ls s3://awsexamplebucket/historic_climate_parquet/ --summarize --recursive --human-readable输出示例:
Total Objects: 30 Total Size: 9.8 GiB -
确定为实现所需文件数量必须使用的存储桶数量。例如,对于 500 MB 大小的文件和 9.8 GB 的数据集,必须有 20 个文件。
-
要将该数据集转换为 500 MB 大小的文件,请运行以下命令:
CREATE TABLE "historic_climate_parquet_500mb" WITH ( external_location = 's3://awsexamplebucket/historic_climate_parquet_500mb/', format = 'PARQUET', bucket_count=20, bucketed_by = ARRAY['yearmonthday'] ) AS SELECT * FROM historic_climate_parquet -
要确认数据集包含所需数量的文件,请运行以下 ls 命令:
aws s3 ls s3://awsexamplebucket/historic_climate_parquet_500mb/ --summarize --recursive --human-readable输出示例:
2019-09-03 12:01:45 333.9 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00000 2019-09-03 12:01:01 666.7 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00001 2019-09-03 12:01:00 665.6 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00002 2019-09-03 12:01:06 666.0 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00003 2019-09-03 12:00:59 667.3 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00004 2019-09-03 12:01:27 666.0 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00005 2019-09-03 12:01:10 666.5 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00006 2019-09-03 12:01:12 668.3 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00007 2019-09-03 12:01:03 666.8 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00008 2019-09-03 12:01:10 646.4 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00009 2019-09-03 12:01:35 639.0 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00010 2019-09-03 12:00:52 529.5 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00011 2019-09-03 12:01:29 334.2 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00012 2019-09-03 12:01:32 333.0 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00013 2019-09-03 12:01:34 332.2 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00014 2019-09-03 12:01:44 333.3 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00015 2019-09-03 12:01:51 333.0 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00016 2019-09-03 12:01:39 333.0 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00017 2019-09-03 12:01:47 333.0 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00018 2019-09-03 12:01:49 332.3 MiB historic_climate_parquet_500mb/20190903_095742_00001_uipqt_bucket-00019 Total Objects: 20 Total Size: 9.9 GiB
注意:分桶表不支持 INSERT INTO 语句。
相关信息
- 语言
- 中文 (简体)
