動機:我想將數據加載到Apache Drill中。我知道Drill可以處理JSON輸入,但我想看看它如何在Parquet數據上執行。將JSON對象的文件轉換爲Parquet文件
有沒有辦法做到這一點,而無需首先將數據加載到Hive等,然後使用其中一個Parquet連接器來生成輸出文件?
動機:我想將數據加載到Apache Drill中。我知道Drill可以處理JSON輸入,但我想看看它如何在Parquet數據上執行。將JSON對象的文件轉換爲Parquet文件
有沒有辦法做到這一點,而無需首先將數據加載到Hive等,然後使用其中一個Parquet連接器來生成輸出文件?
實際上,您可以使用Drill本身從任何查詢的輸出創建parquet文件。
create table student_parquet as select * from `student.json`;
上面的行應該足夠好。 Drill根據字段中的數據解釋類型。您可以替換自己的查詢並創建鑲木地板文件。
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作業來完成導入。
要完成@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來包含所有可能性。如果有人知道更好的方式來做到這一點,我會很高興。
無需選擇單個列。一個簡單的選擇*應該工作。既然你看到一個錯誤,我想你的'成員'結構在不同的記錄中有不同數量的字段。此外,請注意,從今天開始,無法處理同一列中的模式更改。所以如果你有一個'val1'列,它有不同記錄的字符串和整數的組合,那麼鑽取將無法處理它。 – rahul
相關:http://stackoverflow.com/questions/30565510/how-to-read-and-write-mapstring-object-from-to-parquet-file-in-java-or-scala – okigan