WindowsのRubyで、Apache ArrowのParquetを使えるようにするまでの道のり

msys2には、Arrowのパッケージが収録されているようです。

https://packages.msys2.org/packages/mingw-w64-ucrt-x86_64-arrow

# red-parquet を入れるまで

## まずpacmanシステムを最新にする

```dosbatch:
> ridk enable
> ridk exec pacman.exe -Syuu
> ridk exec pacman.exe -Syuu
```
-Syuu でないとダウングレードが有効にならない

なお以下エラーが出るときは cmd.exe が管理者権限になっていない様子

> error: failed to init transaction (unable to lock database)
> error: could not lock database: Permission denied

* https://qiita.com/k-takata/items/373ec7f23d5d7541f982
* https://ja.wikipedia.org/wiki/Pacman

## Pacman を使って、msys2にarrowのバイナリを入れる

```dosbatch:
> ridk exec pacman.exe -S mingw-w64-ucrt-x86_64-arrow
 ごりごりインストール
 
> ridk exec pacman -Ss mingw-w64-ucrt-x86_64-arrow
ucrt64/mingw-w64-ucrt-x86_64-arrow 20.0.0-1 [インストール済み]
    Apache Arrow is a cross-language development platform for in-memory data (mingw-w64)
```

めでたく [installed] のフラグがつきました

* https://www.msys2.org/docs/package-management/

## gio2を入れる

red-arrow は gio2パッケージに依存するので
* https://rubygems.org/gems/red-arrow

>ridk exec pacman -Ss glib2
ucrt64/mingw-w64-ucrt-x86_64-glib2 2.84.1-2 [インストール済み]
    Common C routines used by GTK+ 3 and other libs (mingw-w64)

> gem list gio2
*** LOCAL GEMS ***
gio2 (4.2.9)

## Rubyモジュールを入れる
https://qiita.com/superrino130/items/c49947028bcba1efe6e0

```dosbatch:
> gem install red-parquet
Temporarily enhancing PATH for MSYS/MINGW...
Using msys2 packages: mingw-w64-ucrt-x86_64-arrow>=19.0.1
Building native extensions. This could take a while...
Successfully installed red-arrow-19.0.1
Building native extensions. This could take a while...
Successfully installed red-parquet-19.0.1
Parsing documentation for red-arrow-19.0.1
Installing ri documentation for red-arrow-19.0.1
Parsing documentation for red-parquet-19.0.1
Installing ri documentation for red-parquet-19.0.1
Done installing documentation for red-arrow, red-parquet after 2 seconds
2 gems installed
```

試してみる
```
> irb
irb(main):001:0> require "arrow"
=> true
```

やったね


# RedAmberも入るかな？
* https://qiita.com/WakameSun/items/614f4c6ddc42bccc1680

```
> gem install red_amber
Fetching red_amber-0.5.2.gem
Successfully installed red_amber-0.5.2
Parsing documentation for red_amber-0.5.2
Installing ri documentation for red_amber-0.5.2
Done installing documentation for red_amber after 0 seconds
1 gem installed
```

> require 'red_amber'

ができるようになった

# 各種レシピ
* https://github.com/red-data-tools/red_amber/blob/main/README.ja.md
* https://github.com/red-data-tools/red_amber/blob/main/doc/DataFrame_Comparison_ja.md

## 郵便番号から住所を得るサンプル
日本郵便のサイトから、郵便番号csvをダウンロードしておく
* https://www.post.japanpost.jp/zipcode/dl/oogaki-zip.html

```post.rb
require "parquet"
require 'red_amber'
include RedAmber

# 引数は CSV.new() と互換あり https://docs.ruby-lang.org/ja/latest/class/CSV.html
df1 = DataFrame.load("01HOKKAI.CSV", format: :csv, headers:false, encoding: "cp932")
df2 = DataFrame.load("02AOMORI.CSV", format: :csv, headers:false, encoding: "cp932")

df = df1.concat(df2)		# 本当はすべての県を連結する必要がある
print df

# 郵便番号 〒0650023 の住所はどこかな?
print res = df[ df[:f2] == "0650023".to_i ]
print res[:f6,:f7,:f8]

# 次からはparquetを開くといいね
df.save("./jpzip.parquet")
```

出力結果
```
> ruby post.rb
          f0      f1      f2 f3             f4                       ...     f14
     <int64> <int64> <int64> <string>       <string>                 ... <int64>
   0    1101      60  600000 ﾎﾂｶｲﾄﾞｳ ｻﾂﾎﾟﾛｼﾁﾕｳｵｳｸ ...       0
   1    1101      64  640941 ﾎﾂｶｲﾄﾞｳ ｻﾂﾎﾟﾛｼﾁﾕｳｵｳｸ ...       0
   2    1101      60  600041 ﾎﾂｶｲﾄﾞｳ ｻﾂﾎﾟﾛｼﾁﾕｳｵｳｸ ...       0
   3    1101      60  600042 ﾎﾂｶｲﾄﾞｳ ｻﾂﾎﾟﾛｼﾁﾕｳｵｳｸ ...       0
   4    1101      64  640820 ﾎﾂｶｲﾄﾞｳ ｻﾂﾎﾟﾛｼﾁﾕｳｵｳｸ ...       0
    :       :       :       : :              :                            ...       :
10716    2446    3912  391204 ｱｵﾓﾘｹﾝ   ｻﾝﾉﾍｸﾞﾝﾊｼｶﾐﾁﾖｳ ...       0
10717    2450    3918  391800 ｱｵﾓﾘｹﾝ   ｻﾝﾉﾍｸﾞﾝｼﾝｺﾞｳﾑﾗ ...       0
10718    2450    3918  391802 ｱｵﾓﾘｹﾝ   ｻﾝﾉﾍｸﾞﾝｼﾝｺﾞｳﾑﾗ ...       0
10719    2450    3918  391801 ｱｵﾓﾘｹﾝ   ｻﾝﾉﾍｸﾞﾝｼﾝｺﾞｳﾑﾗ ...       0
       f0      f1      f2 f3             f4                     f5                     ...     f14
  <int64> <int64> <int64> <string>       <string>               <string>               ... <int64>
0    1103      65  650023 ﾎﾂｶｲﾄﾞｳ ｻﾂﾎﾟﾛｼﾋｶﾞｼｸ ｷﾀ23ｼﾞﾖｳﾋｶﾞｼ ...       0
  f6       f7         f8
  <string> <string>   <string>
0 北海道   札幌市東区 北二十三条東
```

できました