2017-04-25 38 views
2

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

+0

这取决于您的文件格式,SerDe是否可以适应读取它。你能解释你的文件格式吗? JSON,CSV,ORC? –

+0

我正在使用json文件 – Prakash

+0

请从每个文件 –

回答

-1

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

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

-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; 
+0

如果data1.json和data2.json都在同一个目录下(比如说s3: /桶/ DIR /)?我将如何在创建表格查询中提及位置。它是一个有效的scenerio,或者这两个文件必须存在于不同的目录中? – Prakash

+0

在技术上,Athena可以浏览目录中的所有文件,但是它会为不匹配文件条目创建空行。可以过滤查询中的空行。另一方面,每个文件类型都有一个目录会更清晰,但这并不总是可行的。因此,在1个目录上创建2个表是最好的选择。您可以根据需要使用“LOCATION's3:// bucket/dir'”这样的语句为一个目录创建尽可能多的表。 –

1

我相信这对于AWS Athena/Presto来说目前是不可能的(请告诉我,否则!)。

雅典娜表的外部位置(始终为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总会考虑所有文件的第一条路径要求是为一张桌子。