※当ブログではアフィリエイト広告を利用しています。
Apache Hive のテーブルでサポートされているファイルフォーマットのPARQUET
は、ファイル単体では中身を確認するのが困難です。
Parquet ファイルを検査できるツール parquet-tools を使って中身を確認してみたので、その方法をメモします。
parquet-tools とは
Apache Parquet が公開している Java ベースのコマンドラインツールです。Parquet ファイルの中身・スキーマ・メタ情報などをコマンドラインから簡単に確認することができます。
ソースコードは GitHub で公開されています。
※2021/01/16追記 master
branch ではこちらのCommitでparquet-tools
からparquet-tools-deprecated
へ移されたようです・・。parquet-1.11.x
branch なら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 をビルドするため、gcc
とgcc-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 TABLE
でstring
の部分が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]
おわりに
普段使う機会はあまりなさそうですがテーブル定義をうっかり失くしたときや、テーブル定義が担当者の頭の中だけにあり突然の異動や転職で闇の中・・・といった場合に使えるかもしれません。