2014-02-11 35 views
14

動機:我想將數據加載到Apache Drill中。我知道Drill可以處理JSON輸入,但我想看看它如何在Parquet數據上執行。將JSON對象的文件轉換爲Parquet文件

有沒有辦法做到這一點,而無需首先將數據加載到Hive等,然後使用其中一個Parquet連接器來生成輸出文件?

+0

相關:http://stackoverflow.com/questions/30565510/how-to-read-and-write-mapstring-object-from-to-parquet-file-in-java-or-scala – okigan

回答

2

實際上,您可以使用Drill本身從任何查詢的輸出創建parquet文件。

create table student_parquet as select * from `student.json`; 

上面的行應該足夠好。 Drill根據字段中的數據解釋類型。您可以替換自己的查詢並創建鑲木地板文件。

4

Kite支持通過其命令行實用程序kite-dataset將JSON導入到Avro和Parquet格式。

首先,你會推斷出你的JSON的架構:

kite-dataset json-schema sample-file.json -o schema.avsc

然後你就可以使用該文件來創建一個平面蜂巢表:

kite-dataset create mytable --schema schema.avsc --format parquet

最後,你可以將您的JSON加載到數據集中。

kite-dataset json-import sample-file.json mytable

您也可以導入整個直接存儲在HDFS。在這種情況下,風箏會使用MR作業來完成導入。

+0

FYI - I試過這個,它需要一個hadoop安裝。我也試圖將這些文件轉換成鑽,並且我沒有hadoop。 – Yehosef

+0

正確。上面的鏈接用於安裝在Hadoop集羣上。如果你願意,Maven中心還有一個包含依賴關係的tarball分發版。這個問題的麻煩在於你必須決定這些依賴關係應該是什麼,這取決於Hadoop發行版。這就是爲什麼我建議使用從您運行的集羣獲取Hadoop依賴關係的指示信息。 – blue

1

要完成@rahul的答案,您可以使用鑽取來完成此操作 - 但我需要向查詢中添加更多內容,以便在鑽取時使用它。

create table dfs.tmp.`filename.parquet` as select * from dfs.`/tmp/filename.json` t 

我需要給它的存儲插件(DFS)和「根」的配置可以從整個磁盤讀取和不可寫。但是tmp config(dfs.tmp)是可寫的並寫入到/ tmp。所以我寫信給那裏。

但問題是,如果JSON是嵌套的或可能包含特殊字符,我會得到一個神祕的

org.apache.drill.common.exceptions.UserRemoteException: SYSTEM ERROR: java.lang.IndexOutOfBoundsException: 

如果我有一個看起來像members: {id:123, name:"joe"}的結構我會選擇更改爲

select members.id as members_id, members.name as members_name

select members.id as `members.id`, members.name as `members.name`

得到它的工作。

我假設原因是鑲木地板是一個「列」商店,所以你需要列。 JSON不是默認的,所以你需要轉換它。

問題是我必須知道我的json模式,我必須構建select來包含所有可能性。如果有人知道更好的方式來做到這一點,我會很高興。

+0

無需選擇單個列。一個簡單的選擇*應該工作。既然你看到一個錯誤,我想你的'成員'結構在不同的記錄中有不同數量的字段。此外,請注意,從今天開始,無法處理同一列中的模式更改。所以如果你有一個'val1'列,它有不同記錄的字符串和整數的組合,那麼鑽取將無法處理它。 – rahul