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


Apache Parquet

※当ブログではアフィリエイト広告を利用しています。

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

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

parquet-tools とは

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

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

※2021/01/16追記 masterbranch ではこちらのCommitparquet-toolsからparquet-tools-deprecatedへ移されたようです・・。parquet-1.11.xbranch ならparquet-toolsが存在します。

Maven Repository からのダウンロード

Parquet tools はビルドするほか、Maven Repository から jar がダウンロード可能です。

しかし maven リポジトリにあるものは依存関係にorg.apache.hadoop » hadoop-clientが含まれており、Hadoop がない環境でのローカルモード実行ができないようでした。

ローカルモード実行するため、後述の手順で parquet-tools をビルドします。

parquet-tools のビルド

ソースからビルドする場合、事前準備がいくつか必要です。

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)

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

Thrift のビルドに必要なライブラリの準備

Parquet tools をビルドするために必要な Thrift をビルドするため、gccgcc-g++がインストールされていない場合、インストールしておきます。

sudo yum -y install gcc
sudo yum -y install gcc-c++

また Thrift のビルド時にsrc/thrift/generate/t_cl_generator.cc:29:10: fatal error: boost/tokenizer.hpp: No such file or directoryというエラーが出た場合、boost-develもインストールします。

sudo yum -y install boost-devel

Thrift のビルド・インストール

GitHubのparquet-mrのREADMEにある手順で Thrift をビルド・インストールします

Install Thrift
To build and install the thrift compiler, run:

wget -nv http://archive.apache.org/dist/thrift/0.12.0/thrift-0.12.0.tar.gz
tar xzf thrift-0.12.0.tar.gz
cd thrift-0.12.0
chmod +x ./configure
./configure –disable-gen-erl –disable-gen-hs –without-ruby –without-haskell –without-erlang –without-php –without-nodejs
sudo make install

parquet-tools のビルド

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

git clone https://github.com/apache/parquet-mr.git
cd parquet-mr/
git checkout parquet-1.11.x
cd parquet-tools

※2021/01/16追記 masterブランチからparquet-toolsが消えたためparquet-1.11.xへ変更

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

mvn clean package -Plocal

エラー [ERROR] No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK? が出る場合、JAVA_HOMEで JDK でなく JRE が参照されている、javacがない等が考えられます。

java-1.8.0-openjdk-develをインストールすると JDK を参照できます。

sudo yum -y install java-1.8.0-openjdk-devel.x86_64

これでビルドが通りました。

[INFO] Dependency-reduced POM written at: /home/user/parquet-mr/parquet-tools/dependency-reduced-pom.xml
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

ビルドされたjar./target/に出力されます。parquet-tools-1.12.0-SNAPSHOT.jar(バージョン部分は変わる可能性があります)適当な場所にコピーまたは移動して使えます。

$ ll ./target/
total 43020
drwxrwxr-x 4 user user       33 Apr  1 07:50 classes
drwxrwxr-x 3 user user       25 Apr  1 07:50 generated-sources
drwxrwxr-x 3 user user       30 Apr  1 07:50 generated-test-sources
drwxrwxr-x 2 user user       28 Apr  1 07:50 maven-archiver
drwxrwxr-x 3 user user       35 Apr  1 07:50 maven-status
-rw-rw-r-- 1 user user    91883 Apr  1 07:50 original-parquet-tools-1.12.0-SNAPSHOT.jar
-rw-rw-r-- 1 user user 43929974 Apr  1 07:51 parquet-tools-1.12.0-SNAPSHOT.jar
-rw-rw-r-- 1 user user    14723 Apr  1 07:50 parquet-tools-1.12.0-SNAPSHOT-tests.jar
-rw-rw-r-- 1 user user     3360 Apr  1 07:50 rat.txt
drwxrwxr-x 2 user user        6 Apr  1 07:51 surefire
drwxrwxr-x 2 user user     4096 Apr  1 07:50 surefire-reports
drwxrwxr-x 3 user user       17 Apr  1 07:50 test-classes

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.12.0-SNAPSHOT.jar cat TM_WORLD_BORDERS.parquet

head (ヘッダの確認)

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

$ java -jar ./parquet-tools-1.12.0-SNAPSHOT.jar head TM_WORLD_BORDERS.parquet

schema (スキーマの確認)

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

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

meta (メタ情報の確認)

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

$ java -jar ./parquet-tools-1.12.0-SNAPSHOT.jar meta TM_WORLD_BORDERS.parquet
file:        file:/home/user/parquet-mr/parquet-tools/target/TM_WORLD_BORDERS.parquet
creator:     parquet-mr version 1.5.0

file schema: hive_schema
--------------------------------------------------------------------------------
shape:       OPTIONAL BINARY L:STRING R:0 D:1
fips:        OPTIONAL BINARY L:STRING R:0 D:1
iso2:        OPTIONAL BINARY L:STRING R:0 D:1
iso3:        OPTIONAL BINARY L:STRING R:0 D:1
un:          OPTIONAL INT32 R:0 D:1
name:        OPTIONAL BINARY L:STRING 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:RLE,PLAIN,BIT_PACKED ST:[num_nulls: 0, min/max not defined]
fips:         BINARY UNCOMPRESSED DO:0 FPO:8516805 SZ:1507/1507/1.00 VC:246 ENC:RLE,PLAIN,BIT_PACKED ST:[num_nulls: 0, min/max not defined]
iso2:         BINARY UNCOMPRESSED DO:0 FPO:8518312 SZ:1515/1515/1.00 VC:246 ENC:RLE,PLAIN,BIT_PACKED ST:[num_nulls: 0, min/max not defined]
iso3:         BINARY UNCOMPRESSED DO:0 FPO:8519827 SZ:1763/1763/1.00 VC:246 ENC:RLE,PLAIN,BIT_PACKED ST:[num_nulls: 0, min/max not defined]
un:           INT32 UNCOMPRESSED DO:0 FPO:8521590 SZ:1027/1027/1.00 VC:246 ENC:RLE,PLAIN,BIT_PACKED ST:[min: 4, max: 894, num_nulls: 0]
name:         BINARY UNCOMPRESSED DO:0 FPO:8522617 SZ:3690/3690/1.00 VC:246 ENC:RLE,PLAIN,BIT_PACKED ST:[num_nulls: 0, min/max not defined]
area:         INT64 UNCOMPRESSED DO:0 FPO:8526307 SZ:1922/1922/1.00 VC:246 ENC:RLE,PLAIN_DICTIONARY,BIT_PACKED ST:[min: 0, max: 1638094, num_nulls: 0]
pop2005:      DOUBLE UNCOMPRESSED DO:0 FPO:8528229 SZ:2019/2019/1.00 VC:246 ENC:RLE,PLAIN,BIT_PACKED ST:[min: -0.0, max: 1.312978855E9, num_nulls: 0]
region:       INT32 UNCOMPRESSED DO:0 FPO:8530248 SZ:175/175/1.00 VC:246 ENC:RLE,PLAIN_DICTIONARY,BIT_PACKED ST:[min: 0, max: 150, num_nulls: 0]
subregion:    INT32 UNCOMPRESSED DO:0 FPO:8530423 SZ:307/307/1.00 VC:246 ENC:RLE,PLAIN_DICTIONARY,BIT_PACKED ST:[min: 0, max: 155, num_nulls: 0]
lon:          FLOAT UNCOMPRESSED DO:0 FPO:8530730 SZ:1027/1027/1.00 VC:246 ENC:RLE,PLAIN,BIT_PACKED ST:[min: -178.131, max: 179.219, num_nulls: 0]
lat:          FLOAT UNCOMPRESSED DO:0 FPO:8531757 SZ:1027/1027/1.00 VC:246 ENC:RLE,PLAIN,BIT_PACKED ST:[min: -80.446, max: 78.83, num_nulls: 0]

おわりに

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