2

我在 s3 存储桶目录中有多个文件(所有文件都在同一目录中)。所有文件都有不同的结构,例如如果一个文件有 4 列,那么第二个文件有 6 个不同的列。如何使用这些文件创建 Athena 表?

4

4 回答 4

1

我相信 AWS Athena / Presto 目前无法做到这一点(请另外告诉我!)。

Athena 表的外部位置(始终EXTERNAL TABLE)必须是目录。

s3://mybucket/folder/table/file_a并且s3://mybucket/folder/table/file_b用不同的结构会导致SCHEMA_MISMATCH

Athena 需要格式为s3://mybucket/folder/table1/和的表格s3://mybucket/folder/table2/

更新

从与 AWS 支持的对话中:

对于第一个路径要求,您必须将每个表的文件明智地移动到单独的文件夹中,否则 Athena 将始终认为所有文件都用于单个表。

于 2017-10-18T04:08:31.243 回答
0

如果您的文件包含不同的数据,您需要将它们定义为不同的外部表(每个都有自己的CREATE EXTERNAL TABLE语句)。

然后,您可以通过 JOIN 跨多个表运行查询。

于 2017-04-26T00:40:44.940 回答
0

您可以在 Athena 中创建指向特定文件的表。

您所做的是创建一个具有特殊输入格式的表:

STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat'

然后不是LOCATION将表指向实际文件,而是将其指向带有单个symlink.txt文件的前缀(或将每个分区指向带有单个 的前缀symlink.txt)。在symlink.txt文件中,添加要包含在表中的文件的 S3 URI,每行一个。

我所知道的有关此功能的唯一文档是用于与 Athena 集成的 S3 Inventory 文档

您还可以在此 Stackoverflow 响应中找到完整示例:https ://stackoverflow.com/a/55069330/1109

于 2019-03-31T11:32:48.357 回答
-1

与以下场景。

数据1.json:

{"a":"data1","b":"data2"}

数据2.json

{"c":"data3","d":"data4"}

您可以创建以下表格:

create external table data1 (
  a string,
  b string
)
ROW FORMAT  serde 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://bucket/x';
create external table data2 (
  c string,
  d string
)
ROW FORMAT  serde 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://bucket/x';

现在您可以查询通过单独表定义的单独文件。您唯一需要注意的是,不同的文件类型将在您的结果中生成空条目。

select * from data1 where a is not null;
select * from data2 where c is not null;
于 2017-04-26T19:36:19.530 回答