我在s3 bucket目录中有多个文件(所有文件都在同一个目录中)。所有文件都有不同的结构,如果一个文件有4列,则第二个文件有6个不同的列。 如何使用这些文件创建Athena表?
答案 0 :(得分:1)
我相信AWS Athena / Presto目前无法做到这一点(请告诉我!)。
Athena表的外部位置(始终为EXTERNAL TABLE
)必须是目录。
s3://mybucket/folder/table/file_a
和s3://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;