web-dev-qa-db-ja.com

JSONオブジェクトのファイルをParquetファイルに変換します

動機:データをApacheDrillにロードしたい。 DrillがJSON入力を処理できることは理解していますが、Parquetデータでどのように機能するかを確認したいと思います。

最初にデータをHiveなどにロードしてから、Parquetコネクタの1つを使用して出力ファイルを生成せずにこれを行う方法はありますか?

17
danieltahara

Kite は、コマンドラインユーティリティを介してAvro形式とParquet形式の両方にJSONをインポートすることをサポートしています kite-dataset

まず、JSONのスキーマを推測します。

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

次に、そのファイルを使用してParquetHiveテーブルを作成できます。

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

そして最後に、JSONをデータセットにロードできます。

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

HDFSに直接保存されている全体をインポートすることもできます。その場合、KiteはMRジョブを使用してインポートを実行します。

5
blue

実際には、Drill自体を使用して、任意のクエリの出力から寄木細工のファイルを作成できます。

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

上記の行で十分です。ドリルは、フィールドのデータに基づいてタイプを解釈します。独自のクエリに置き換えて、寄木細工のファイルを作成できます。

3
rahul

@rahulの回答を完了するには、drillを使用してこれを行うことができますが、クエリにさらに追加して、drillを使用してすぐに機能させる必要がありました。

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

ストレージプラグイン(dfs)を指定する必要があり、「root」構成はディスク全体から読み取ることができ、書き込みできません。ただし、tmp構成(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を構築する必要があることです。これを行うためのより良い方法を知っている人がいれば幸いです。

1
Yehosef