如何在Athena中使用具有不同结构的多个文件

时间:2017-04-25 09:19:39

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

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

4 个答案:

答案 0 :(得分:1)

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

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

具有不同结构的

s3://mybucket/folder/table/file_as3://mybucket/folder/table/file_b将导致SCHEMA_MISMATCH

雅典娜希望表格格式为s3://mybucket/folder/table1/s3://mybucket/folder/table2/

更新

与AWS支持对话:

  

对于第一个路径要求,您必须在单独的文件夹中按表格移动文件,否则Athena将始终将所有文件都视为单个表。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

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

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

我唯一了解此功能的文档是S3 Inventory documentation for integrating with Athena

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

答案 3 :(得分:-1)

使用以下方案。

data1.json:

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

data2.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;