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.xml
のcom.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 TABLE
でstring
の部分が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
おわりに
普段使う機会はあまりなさそうですがテーブル定義をうっかり失くしたときや、テーブル定義が担当者の頭の中だけにあり突然の異動や転職で闇の中・・・といった場合に使えるかもしれません。