【问题标题】:can athena table be created for s3 bucket sub-directories?可以为 s3 存储桶子目录创建 athena 表吗?
【发布时间】:2020-04-15 21:51:38
【问题描述】:

我们的 s3 存储桶通常有许多子目录,因此存储桶的路径类似于 s3:top-level-function-group/more-specific-folder/org-tenant-company-id/entityid /实际数据

我们正在研究 Athena 是否能够在该 /actual-data 级别查询数据,但在 org-tenant-company-id 内,因此必须将其作为某种参数传递。

或者那个 org-tenant-company-id 会是一个分区吗?

是否可以创建一个查询此结构的 athena 表?创建表向导上的 s3 位置是什么?我用 s3:top-level-function-group/more-specific-folder/ 尝试了它,但是当它运行时,我认为它说的是“读取 0 Kb 数据”。

【问题讨论】:

  • 你的计划对我来说是可行的。可以分享一下不起作用的create table语句吗?
  • 最初的 create table 语句似乎有效;至少它没有出错;但它也没有加载任何数据;我又试了一次,我认为问题是一个不存在的列;现在我想沿着 org-tenant-company-id 子目录对其进行分区,但这可能是一个单独的问题,除非你知道它

标签: amazon-athena


【解决方案1】:

您可以按如下方式创建分区表,其中分区键仅在 PARTITIONED BY 子句中定义,而不是在表字段列表中:

CREATE EXTERNAL TABLE mydb.mytable (
    id int,
    stuff string,
    ...
)
PARTITIONED BY (
    orgtenantcompanyid string
)
LOCATION 's3://mybucket/top-level-function-group/more-specific-folder/';

创建表后,您可以加载各个分区:

ALTER TABLE mydb.mytable ADD PARTITION (orgtenantcompanyid='org1')
LOCATION 's3://mybucket/top-level-function-group/more-specific-folder/org1';

结果行将包含分区字段,如orgtenantcompanyid

【讨论】:

  • 谢谢,但我认为我们需要自动完成分区。不想手动维护分区。看起来我们必须将子目录更改为“key=value”格式,以便自动将它们识别为分区
  • 你还需要打电话给MSCK REPAIR TABLE mydb.mytable吗? Scenario 1: Data already partitioned and stored on S3 in hive format
  • 我不知道,从那里不清楚您是否需要在创建更多分区时继续调用该命令,或者它是否是一次性的。
  • 我不得不继续调用它。但它确实会自动发现可用分区,如果您要添加多个分区,这可能会很好。
【解决方案2】:

是的,可以创建只使用特定子目录的内容的表。

创建表格后看到 0kb 读取是正常的。那是因为创建表时没有读取数据。

要检查您是否可以准确地查询数据,请执行以下操作:

SELECT * FROM <table_name> LIMIT 10

仅当所有不同目录中的数据结构相同时,分区才有意义,以便表定义适用于该位置下的所有数据。

是的,可以使用路径结构来创建分区。但是,如果格式不正确/key=value/,则不会自动出现。不过,您可以将路径用作属性,如下所述:How to get input file name as column in AWS Athena external tables

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    • 2019-05-06
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多