AWS Athena:使用"文件夹"名称为分区

时间:2017-03-01 09:05:15

标签: amazon-web-services amazon-s3 amazon-athena

我在s3中存储了数千个单独的json文件(对应于一个Table行),其中包含以下路径:s3://my-bucket/<date>/dataXX.json

当我在DDL中创建表时,是否可以在S3路径中将数据分区? (或者至少在新列中添加值)

由于

4 个答案:

答案 0 :(得分:7)

可悲的是,雅典娜不支持这一点。对于使用文件夹进行分区,需要指定文件夹的名称。

e.g。 S3://我的桶/ {COLUMNNAME} = {} columnvalue /data.json

在您的情况下,如果您手动将这些分区添加到表中,您仍然可以使用分区。

e.g。 ALTER TABLE tablename ADD PARTITION(datecolumn ='2017-01-01')location's3:// my-bucket / 2017-01-01 /

AWS文档在该主题上有一些很好的例子。

AWS Athena Partitioning

答案 1 :(得分:2)

现在可以使用 storage.location.template 来做到这一点。这将按路径的某些部分进行分区。确保不要在列列表中包含新列,因为它将自动添加。您可以搜索很多选项来为您的日期示例进行调整。我用“id”来显示我能想到的最简单的版本。

CREATE EXTERNAL TABLE `some_table`(
  `col1` bigint, 
PARTITIONED BY (
  `id` string
  )
ROW FORMAT SERDE 
  'org.openx.data.jsonserde.JsonSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'
LOCATION
  's3://path/bucket/'
TBLPROPERTIES (
  'has_encrypted_data'='false',
  'projection.enabled'='true', 
  'projection.id.type' = 'injected',
  'storage.location.template'='s3://path/bucket/${id}/'
  )

官方文档:https://docs.amazonaws.cn/en_us/athena/latest/ug/partition-projection-dynamic-id-partitioning.html

答案 2 :(得分:0)

不需要手动执行此操作。如果路径中的所有文件夹具有相同的结构,并且所有数据具有相同的架构设计,则设置一个粘着性爬虫,它将以文件夹的形式将文件夹(位于前缀中)作为分区。

将其命名为partition0。您可以进入edit-schema并将此分区的名称更改为date或任何您喜欢的名称。

但是请确保您进入了粘合爬虫,并在“配置选项”下选择了选项-“仅添加新列”。否则,在下一次运行粘合程序时,它将分区名称重设为partition0。

答案 3 :(得分:0)

您需要为每个S3文件夹命名,如下图:

image

在设置了Athena之后,为分区指定dt:

image

然后,在雅典娜上运行MSCK REPAIR TABLE <your table name>;