2017-04-25 28 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總會考慮所有文件的第一條路徑要求是爲一張桌子。