parquet-tools を使って Parquet ファイルの中身やスキーマを確認する方法

parquet-tools

Apache Hive のテーブルでサポートされているファイルフォーマットのPARQUETは、ファイル単体では中身を確認するのが困難です。

Parquet ファイルを検査できるツール parquet-tools を使って中身を確認してみたので、その方法をメモします。

parquet-tools とは

Apache Parquet が公開している Java ベースのコマンドラインツールです。Parquet ファイルの中身・スキーマ・メタ情報などをコマンドラインから簡単に確認することができます。

ソースは GitHub で公開されています。

ソース: parquet-mr/parquet-tools at master · Parquet/parquet-mr · GitHub

parquet-tools のビルド

簡単に探したところビルド済みのjarは見当たらなかったのでビルドします。前提として maven が必要です。

maven のインストール

maven は下記のような公式サイトに記載の手順でインストールしておきます。

wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
tar xzvf apache-maven-3.3.9-bin.tar.gz
$ ./apache-maven-3.3.9/bin/mvn -version
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-10T16:41:47+00:00)

適宜パスを通しておきます。

parquet-tools のビルド

GitHub からクローンしたあとビルドします。

git clone https://github.com/Parquet/parquet-mr.git
cd ./parquet-mr/parquet-tools/

今回はローカルモードで動かしたいので-Plocalオプションを付けました。Hadoop モードで使用する場合は-Plocalオプションは不要です。

mvn clean package -Plocal

が、以下のエラーが出てビルドに失敗します。

[ERROR] Failed to execute goal on project parquet-tools: Could not resolve dependencies for project com.twitter:parquet-tools:jar:1.6.0rc3-SNAPSHOT: Failure to find com.twitter:parquet-hadoop:jar:1.6.0rc3-SNAPSHOT in https://oss.sonatype.org/content/repositories/snapshots was cached in the local repository, resolution will not be reattempted until the update interval of sonatype-nexus-snapshots has elapsed or updates are forced -> [Help 1]

こちらのissueで報告されているようにpom.xmlcom.twitterのバージョンを1.6.0rc3-SNAPSHOTから1.6.0にしたらビルドが通りました。

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

ビルドされたjar./target/parquet-tools-1.6.0.jarに出力されます。適当な場所にコピーまたは移動して使えます。

parquet-tools の使用

以下のCREATE TABLEで作成し、あらかじめデータを投入しておいた Parquet 形式のファイルの中身を調べてみます。

CREATE EXTERNAL TABLE IF NOT EXISTS TM_WORLD_BORDERS_PARQUET (
Shape string,
FIPS string,
ISO2 string,
ISO3 string,
UN int,
NAME string,
AREA bigint,
POP2005 double,
REGION int,
SUBREGION int,
LON float,
LAT float
)
STORED AS PARQUET
LOCATION '/path/to/parquet/file/';

cat (中身の確認)

中身の件数が多いと大量に標準出力されるので注意が必要です。

$ java -jar ./parquet-tools-1.6.0.jar cat TM_WORLD_BORDERS.parquet

head (ヘッダの確認)

デフォルトでは5件分の中身を表示するようです。

$ java -jar ./parquet-tools-1.6.0.jar head TM_WORLD_BORDERS.parquet

schema (スキーマの確認)

CREATE TABLEstringの部分がbinaryになっている等の若干の違いがありますが、スキーマが確認できます。

$ java -jar ./parquet-tools-1.6.0.jar schema TM_WORLD_BORDERS.parquet
message hive_schema {
  optional binary shape (UTF8);
  optional binary fips (UTF8);
  optional binary iso2 (UTF8);
  optional binary iso3 (UTF8);
  optional int32 un;
  optional binary name (UTF8);
  optional int64 area;
  optional double pop2005;
  optional int32 region;
  optional int32 subregion;
  optional float lon;
  optional float lat;
}optional float lat;<br>}

meta (メタ情報の確認)

スキーマや row group が確認できます。

$ java -jar ./parquet-tools-1.6.0.jar meta TM_WORLD_BORDERS.parquet
file:        file:/path/to/parquet/file/TM_WORLD_BORDERS.parquet
creator:     parquet-mr version 1.5.0

file schema: hive_schema
--------------------------------------------------------------------------------
shape:       OPTIONAL BINARY O:UTF8 R:0 D:1
fips:        OPTIONAL BINARY O:UTF8 R:0 D:1
iso2:        OPTIONAL BINARY O:UTF8 R:0 D:1
iso3:        OPTIONAL BINARY O:UTF8 R:0 D:1
un:          OPTIONAL INT32 R:0 D:1
name:        OPTIONAL BINARY O:UTF8 R:0 D:1
area:        OPTIONAL INT64 R:0 D:1
pop2005:     OPTIONAL DOUBLE R:0 D:1
region:      OPTIONAL INT32 R:0 D:1
subregion:   OPTIONAL INT32 R:0 D:1
lon:         OPTIONAL FLOAT R:0 D:1
lat:         OPTIONAL FLOAT R:0 D:1

row group 1: RC:246 TS:8532780 OFFSET:4
--------------------------------------------------------------------------------
shape:        BINARY UNCOMPRESSED DO:0 FPO:4 SZ:8516801/8516801/1.00 VC:246 ENC:BIT_PACKED,RLE,PLAIN
fips:         BINARY UNCOMPRESSED DO:0 FPO:8516805 SZ:1507/1507/1.00 VC:246 ENC:BIT_PACKED,RLE,PLAIN
iso2:         BINARY UNCOMPRESSED DO:0 FPO:8518312 SZ:1515/1515/1.00 VC:246 ENC:BIT_PACKED,RLE,PLAIN
iso3:         BINARY UNCOMPRESSED DO:0 FPO:8519827 SZ:1763/1763/1.00 VC:246 ENC:BIT_PACKED,RLE,PLAIN
un:           INT32 UNCOMPRESSED DO:0 FPO:8521590 SZ:1027/1027/1.00 VC:246 ENC:BIT_PACKED,RLE,PLAIN
name:         BINARY UNCOMPRESSED DO:0 FPO:8522617 SZ:3690/3690/1.00 VC:246 ENC:BIT_PACKED,RLE,PLAIN
area:         INT64 UNCOMPRESSED DO:0 FPO:8526307 SZ:1922/1922/1.00 VC:246 ENC:BIT_PACKED,PLAIN_DICTIONARY,RLE
pop2005:      DOUBLE UNCOMPRESSED DO:0 FPO:8528229 SZ:2019/2019/1.00 VC:246 ENC:BIT_PACKED,RLE,PLAIN
region:       INT32 UNCOMPRESSED DO:0 FPO:8530248 SZ:175/175/1.00 VC:246 ENC:BIT_PACKED,PLAIN_DICTIONARY,RLE
subregion:    INT32 UNCOMPRESSED DO:0 FPO:8530423 SZ:307/307/1.00 VC:246 ENC:BIT_PACKED,PLAIN_DICTIONARY,RLE
lon:          FLOAT UNCOMPRESSED DO:0 FPO:8530730 SZ:1027/1027/1.00 VC:246 ENC:BIT_PACKED,RLE,PLAIN
lat:          FLOAT UNCOMPRESSED DO:0 FPO:8531757 SZ:1027/1027/1.00 VC:246 ENC:BIT_PACKED,RLE,PLAIN

おわりに

普段使う機会はあまりなさそうですがテーブル定義をうっかり失くしたときや、テーブル定義が担当者の頭の中だけにあり突然の異動や転職で闇の中・・・といった場合に使えるかもしれません。