PythonでParquetフォーマットを扱ってみたいので調べていた

ParquetフォーマットをPythonから扱ってみたいので調べていた。
GitHub - jcrobak/parquet-python: python implementation of the parquet columnar file format.
githubにあったものを見つけたけど、まだバグが結構あるっぽい。書き込みなども実装されてないようなので、実用は無理そう。
Parquetフォーマットの仕様は公開されてるから、モジュールを自作しないとダメっぽいかな。
試すだけ試してみた。

インストール

snappy圧縮を扱うためにpython-snappyを入れておく。libsnappy-devを入れておかないとインストールでこける。

$ aptitude install libsnappy-dev
$ git clone https://github.com/jcrobak/parquet-python.git
$ mkvirtualenv parquet
(parquet)$ pip install parquet-python
(parquet)$ pip install python-snappy

ImpalaでParquetフォーマットのテーブルを作ってデータを入れておく

impala-shellでParquetフォーマットのテーブルを作ってデータを入れておく。insert一回につき1つのParquetフォーマットファイルがHDFS上に作られてる。デフォルトでSnappy圧縮なのかな。

[slave1.hadoop.nullpobug.com:21000] > create table table1_parquet (c1 INT, c2 STRING) STORED AS PARQUET;
Query: create table table1_parquet (c1 INT, c2 STRING) STORED AS PARQUET

Returned 0 row(s) in 1.30s
[slave1.hadoop.nullpobug.com:21000] > insert into table1_parquet values (12345, "spam");
Query: insert into table1_parquet values (12345, "spam")
Inserted 1 rows in 7.84s
[slave1.hadoop.nullpobug.com:21000] > insert into table1_parquet values (54321, "egg");
Query: insert into table1_parquet values (54321, "egg")
Inserted 1 rows in 0.59s
[slave1.hadoop.nullpobug.com:21000] > select * from table1_parquet;
Query: select * from table1_parquet
+-------+------+
| c1    | c2   |
+-------+------+
| 12345 | spam |
| 54321 | egg  |
+-------+------+
Returned 2 row(s) in 1.10s

HDFSNFSマウントしてparquet-pythonで見てみる

HDFSからファイルをgetで手元に持ってきてもいいんだけど、面倒だったのでNFSマウントして読み込んでみた。

(parquet)$ sudo mount -t nfs -o vers=3,nolock 192.168.11.111:/ /mnt
(parquet)$ /mnt/user/hive/warehouse/table1_parquet
(parquet)$ ls
(parquet)$ python -m parquet 23424a1c672030c0-328d0d142b02beb7_168138759_data.0 --metadata
File Metadata: 23424a1c672030c0-328d0d142b02beb7_168138759_data.0
  Version: 1
  Num Rows: 1
  k/v metadata: 
    (none)
  schema: 
    schema (None): length=None, repetition=None, children=2, converted_type=None
    c1 (INT32): length=None, repetition=OPTIONAL, children=None, converted_type=None
    c2 (BYTE_ARRAY): length=None, repetition=OPTIONAL, children=None, converted_type=None
c1      c2
12345   spam
(parquet)$ python -m parquet ce4693f4d1c5ba92-bbae6347a1a25b93_1955015047_data.0 --metadata
File Metadata: ce4693f4d1c5ba92-bbae6347a1a25b93_1955015047_data.0
  Version: 1
  Num Rows: 1
  k/v metadata: 
    (none)
  schema: 
    schema (None): length=None, repetition=None, children=2, converted_type=None
    c1 (INT32): length=None, repetition=OPTIONAL, children=None, converted_type=None
    c2 (BYTE_ARRAY): length=None, repetition=OPTIONAL, children=None, converted_type=None
c1      c2
54321   egg

読み込みは大丈夫そう。書き込みがないのでここまでか。