【问题标题】:Set number of records in in a file while unloading in athena to S3在 athena 中卸载到 S3 时设置文件中的记录数
【发布时间】:2021-04-06 06:15:30
【问题描述】:

我正在使用 CTAS 命令,我想知道是否有办法在 S3 中设置文件中的记录数。我现在所要做的就是在此链接中设置大小:

https://aws.amazon.com/premiumsupport/knowledge-center/set-file-number-size-ctas-athena/

但是,我不会事先知道尺寸。

我将使用这个命令

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

我没有看到任何设置记录数的选项。

我该怎么做?

提前致谢

【问题讨论】:

    标签: sql hive amazon-athena presto bucket


    【解决方案1】:

    没有人事先知道应该创建多少个桶才能获得所需的大小或每个文件的行数。

    这就是为什么(如您提供的链接中所述)他们正在测量总大小,将其除以获取桶数所需的桶大小。并且您无法指定大小,只能在创建表时指定存储桶的数量。计算完桶数后,创建新的桶表并从初始表重新加载数据。

    因此,如果您希望文件包含所需的行数而不是所需的大小,则需要使用相同的方法计算存储桶的数量。

    1. 计算初始数据集中的总行数:

    select count(*) as cnt from historic_climate_gz

    1. 例如,您的表包含 1000000 (1M) 行。并且您想要拥有 10K 行的存储桶。计算bucket_count = 1000000/10000 = 100

    创建一个有 100 个桶的新桶表并重新加载数据,其中的每个文件将大约包含 10K 行(如果桶键分布均匀且具有足够的基数)。

    CREATE TABLE "historic_climate_gz_20_files"
    WITH (
          external_location = 's3://awsexamplebucket/historic_climate_gz_20_files/',
          format = 'TEXTFILE',
          bucket_count=100,   ---100 buckets
          bucketed_by = ARRAY['yearmonthday']
           ) as
    select * from historic_climate_gz
    

    你看,在桶表的情况下,你只能控制 number_of_buckets 和桶键。大小或行数是近似值(预期),并不准确。当然,对于不均匀分布的桶密钥,您将获得不同大小的桶。其中一些更大,一些更小。对于均匀分布的键,您将拥有大致相同的行数。

    由该函数决定哪一行到哪个桶:

    `hash(bucket_key) MOD number_of_buckets` where hash is integer.
    

    MOD[0, number_of_buckets-1] 范围内生成整数桶编号。桶数和桶键是你可以在加载之前指定的。

    具有相同值的行将被写入同一个桶中。如果您在存储桶键分布中存在偏差,那么您将拥有大小和行数不同的存储桶(相应地倾斜)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 2018-03-22
      • 2013-07-04
      • 1970-01-01
      相关资源
      最近更新 更多