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
HDFSをNFSマウントして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
読み込みは大丈夫そう。書き込みがないのでここまでか。