我在 s3 存储桶目录中有多个文件(所有文件都在同一目录中)。所有文件都有不同的结构,例如如果一个文件有 4 列,那么第二个文件有 6 个不同的列。如何使用这些文件创建 Athena 表?
4 回答
我相信 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 将始终认为所有文件都用于单个表。
如果您的文件包含不同的数据,您需要将它们定义为不同的外部表(每个都有自己的CREATE EXTERNAL TABLE
语句)。
然后,您可以通过 JOIN 跨多个表运行查询。
您可以在 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
与以下场景。
数据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;